作者:随风kali
什么是SQL注入
SQL注入即是指web运用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web运用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情形下实现造孽操作,以此来实现欺骗数据库做事器实行非授权的任意查询,从而进一步得到相应的数据信息。

这里以一个PHP的SQL语句代码为例
$SQL = "select from '某字段' where id = $id";
由于这里的参数id可以掌握,且这个id被带进了数据库查询,以是一些意图不轨的人可以通过拼接SQL语句来进行攻击。
产生SQL注入须要的条件
SQL注入的产生须要两个条件
1.我们通报给后真个参数是可以掌握的
2.参数内容会被带入到数据库查询
验证是否存在SQL注入
还是以这个代码为例 $SQL = "select from '某字段' where id = $id";
在这里我们可以掌握的参数是id这个参数,以是我们输入1‘的时候。这时查询语句实行的内容就为
select from '某字段' where id = 1’
由于后面有一个单引号,这样的语句不符合数据库语法的规范,以是会报错,从而判断出该处是否存在SQL注入。
SQL注入的分类
SQL注入分为很多种,有联合注入、布尔注入、报错注入、韶光注入、堆叠注入、二次注入、宽字节注入、cookie注入等等等。当然这些注入所产生的事理都是一样,如上文所讲。在接下来的文章呢,笔者也会对这些注入结合实例进行全部写出来。
SQL注入的防御
方案一
采取预编译技能
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
利用预编译的SQL语句,SQL语句的语义不会是不会发生改变的。预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成理解析,检讨,编译等事情,以是攻击者无法改变SQL语句的构造,只是把值赋给?,然后将?这个变量传给SQL语句。当然还有一些通过预编译绕过某些安全防护的操作,大家感兴趣可以去搜索一下。
方案二
严格掌握数据类型
在java、c等强类型措辞中一样平常是不存在数字型注入的,由于在接管到用户输入id时,代码一样平常会做一个int id 的数据类型转换,如果我们输入的是字符串的话,那么这种情形下,程序就会报错。但是在PHP、ASP这些没有强调处理数据类型的措辞,一样平常我们看到的吸收id的代码都是如下等代码。
$id = $_GET['id'];
$SQL = "select from '某字段' where id = $id;";
这样的代码攻击者就可以通过布局id参数利用联合查询等手腕进行SQL注入,如果这里我们加入一个检讨数字类型函数is_numeric()这样就可以防止数字型注入了。
方案三
对分外的字符进行转义
数字型注入可以通过检讨数据类型防止,但是字符型不可以,那么怎么办呢,最好的办法便是对分外的字符进行转义了。比如在MySQL中我们可以对" ' "进行转义,这样就防止了一些恶意攻击者来闭合语句。当然我们也可以通过一些安全函数来转义分外字符。如addslashes()等,但是这些函数并非一劳永逸,攻击者还可以通过一些分外的办法绕过。