前言:
如今咱们对“php中的sql语句”大体比较注意,小伙伴们都需要了解一些“php中的sql语句”的相关知识。那么小编同时在网络上汇集了一些有关“php中的sql语句””的相关内容,希望兄弟们能喜欢,兄弟们快快来了解一下吧!本文原载于公众号:猪猪谈安全
作者:随风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()等,但是这些函数并非一劳永逸,攻击者还可以通过一些特殊的方式绕过。
标签: #php中的sql语句 #php拼接sql