1. SQL注入概念
1.1 SQL注入简介
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
“SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(”缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,就会造成一些出人意料的结果,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
1.2 SQL注入攻击的总体思路
1.寻找到SQL注入的位置
2.判断 服务器类型 和后台数据库类型
3.针对不通的服务器和数据库特点进行SQL注入攻击
2. SQL注入攻击实例
比如在一个登录界面,要求输入用户名和密码:
可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 –
密 码:
点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)
这是为什么呢? 下面我们分析一下:
从理论上说,后台认证程序中会有如下的SQL语句:
String sql = “select * from user_table where username=
‘ “+ username +” ‘ and password=’ “+password+” ‘”;
当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=
”or 1 = 1 — and password=”
分析SQL语句:
条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE
username=” ;DROP DATABASE (DB Name) –‘ and password=”
….其后果可想而知…
3. SQL注入的解决方法
1)检查变量数据类型和格式
1、 使用正则表达式 过滤传入的参数
2、PHP函数检查变量
3、前端js检查是否包函非法字符
不灵活,要写死多个检测方法
2)过滤 特殊符号
对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP为例,通常是采用addslashes函数,它会在指定的预定义字符前添加 反斜杠 转义,这些预定义的字符是: 单引号 (‘) 双 引号 (“) 反斜杠 (\) NULL。
相对安全,只是增加黑客的难度,还是能破解
3、绑定变量,使用预编译语句
总结
觉得不错的希望可以点个赞,你的点赞是我发文的最大动力,后续还会推出一系列关于数据库的干货,敬请大家期待!
如果文章有不正之处 请大家评论批评指正 我会看心情改 也有可能不会改!
尘世中一个浪荡的程序员 只为升级打怪!