什么是SQL注入攻击
SQL注入即使指Web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在Web应用程序中实现定义好的查询语句的结尾添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息.
如何防止SQL注入
SQL有句老话,有输入的地方就有可能存在SQL注入,该如何防止SQL注入?SQL注入产生的原理归根结底还是用户输入的代码被数据库执行了,所有解铃还须系铃人,防御SQL注入还是要在代码层面上去解决
解决方案
方案一
采用预编译技术
INSERT INTO Table_name (id,name,age) VALUES(?,?,?)
使用预编译的SQL语句,SQL语句的语义是会发生改变的,预编译语句在创建的时候就已经将指定的SQL语句发送给DBMS(数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS) 完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只要把值赋给 “?” , 然后将 “?” 的变量传给SQL语句,当然还有一些通过预编译绕过某些安全防护的操作.
方案二
严格控制数据类型
在java,c的等强类型语言中一般是不存在数字型注入的,因为在接收到用户输入id时,代码一般会做一个int id的数据类型转换,假如我们输入的是字符串的话,那么这种情况下,程序就会报错,但是在PHP,ASP这些没用强调处理数据类型的语言,一般我们看到的接收id的代码都是如下等代码
$id = $_GET[‘id’];
$SQL = “select * from ‘某字段’ where id = $id”;
这样的代码攻击者就可以通过构造id参数运用联合查询等手法进行SQL注入,假如这里我们加入一个检查数字类型的函数js_numeric()这样就可以防止数字型注入了.
方案三
对特殊类型的字符进行转义
数字型注入可以通过检查时间类型防止,但是字符型不可以,所以最好就是对特殊的字符进行转义,比如在MySQL中我们可以对" , " 进行转义,这样就防止了一些恶意攻击者来闭合语句,当然,我们也可以通过一些安全函数来转义特殊字符,如addslashes () 等,但是这些函数并非一劳永逸,攻击者还是可以通过一写特殊的方式绕过.