SQL注入攻击是指在特定场合向SQL语句中植入特定SQL语句,来达到破坏或更改数据的目的,常见于表单提交或者是在URL地址栏输入。
常见注入方式
-1 or 1=1
例如:在URL输入:www.XXX.com?id=1,将得到对应数据,但是如果篡改为www.XXX.com?id=-1 or 1=1,意思变为id=false or true ,将永远等于true,理论将会取出所有数据,这时的where判断将会失效。
#’ 或 ‘–
例如:使用用户名为admin密码为123456登录时SQL语句为,select * from user where username = ‘admin’ and password = ‘123456’;如果用户名更改为admin#’,密码不变,将会变成 select * from user where username = ‘admin’#’ and password = ‘123456’; #’后的将会失效,密码判断将会失效。使用’–(单引号加双中划线)会有同样效果。
那应该如何预防SQL注入的问题
在表单提交时通过JavaScript做验证
在表单提交时就通过JavaScript的正则表达式或者jQuery的插件进行判断,如果不符规格就不通过,可以有效减少服务器处理压力。
严格判断输入变量的类型和格式
通过后端程序判断是否为空,是否为整数等类型来在刚刚获取参数时就判断。
通过正则表达式
如果数据的类型符合我们的基本类型规则,那就通过正则表达式来判断是否是我们想要的具体内容。这一步和上一步在thinkPHP5中可通过框架自带的验证来解决。
进行转义
PHP addslashes() 函数可对引号进行转义。
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
PHP htmlspecialchars() 函数把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:可直接存入数据库,取出时 如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。
预编译
使用预编译也可以有效阻止SQL注入,PDO是一个很好的预编译的机制,在thinkPHP中对数据库的操作都使用了PDO。