PHP SQL注入

什么是SQL注入

SQL注入是一种将SQL代码添加到输入参数中,传递给SQL服务器解析并执行的攻击手段。

上个简单案例:

PHP SQL注入

这是正常mysql数据库查询语句,下面展示SQL注入的案例:

select * from dept where deptno = -1 or 1 =1;

PHP SQL注入

这就是所谓的将SQL代码添加到输入参数中,传递给SQL服务器解析并执行,这样就可以得知你的数据库信息。攻击者可以通过SQL代码构造,达到攻击数据库的目的。

如何寻找SQL注入漏洞

先通过请求出发异常,例如get,post,http头信息等,可以在url的后面添加单引号或者其他操作来引发操作异常,得知服务器信息。

如何进行SQL注入攻击

数字注入

第一个案例就是数字注入

就是在数据库查询语句中,where语句中写入一个恒成立的sql语句,从而查询到该表信息

拿 select * from dept where id =1;为例

要让where恒成立,可以给id一个极大值,或者给id一个不可能成立的值,然后在后面拼接 or 1 =1,形成下面语句:

select * from dept where id =-1 or 1= 1;

分析: id = -1,不成立,不执行,然后执行1 =1,恒成立, 假或真为真,查询语句查询到表信息。

字符串注入

字符串注入类似于数字注入,例子:表单登录,验证用户名和密码是否正确,正确则登录

sql代码:select * from user where username = 'james' and password = '123123';(username和password事先存入user表中),这条代码执行后,表单登陆成功、

接下来用字符串注入

PHP SQL注入

在用户名输入时,输入james'#,密码随便填,然后提交,提示登录成功,看验证sql代码:

select * from user where username = 'james'#' and password = '之前你输入的password';

#是mysql中的单行注释方法 

PHP SQL注入

自动将#后面的内容注释,也就是不执行,从而达到字符串注入的攻击效果

同理,mysql的单行注释还有‘-- ’,两个横杠+一个空格,后面接注释内容,也可以达到注释效果

如何预防SQL注入

严格检查输入变量的类型和格式

针对数字注入,可以用is_numeric强制判断是否为整数

案例:

PHP SQL注入

PHP SQL注入

PHP SQL注入

sql代码:select * from article where id = -1 or 1=1;发现,并不能取到信息,原因,用is_numeric强制控制了它的变量类型只能为数字


针对字符串注入,可以在sql语句中限制输入单引号(')、双引号(")、注释符号(#     --    )等等,下面我们用正则表达式限制这些特殊字符串的输入

PHP SQL注入

只允许a-z,A-Z,0-9的字符输入进去并且字符不少于6个,其他均不能通过验证

PHP SQL注入PHP SQL注入


过滤和转义特殊字符

第一种:用addslashes

PHP SQL注入

对特殊字符自动进行转义,例如:

原先sql代码:select * from article where username = 'admin' and password = '111';

sql注入代码: select * from article where username = 'admin'#' and password = '111111';

针对sql注入代码加addslashes转移函数后sql代码:select * from article where username = 'admin\'#' and password = '111111';

通过addslashes转移函数,将原先sql注入的代码中的'进行转义,变成\',从而让#失去作用。

第二种:mysqli中的mysqli_real_escape_string()函数对相应字符中的特殊字符进行转义,使用方法和addslashes一样


mysqli和PDO预定义机制

这两部分自行百度,用法很简单

通用sql查询代码: select (field) from (table) where (id) = ?;

然后定义一个变量表示id的值,接着绑定到sql代码,最后执行。

PHP SQL注入