下面是小编为大家整理的\ serversql去反斜杠_防止SQL注入可以简单通过过滤反斜杠后再转义实现么?,供大家参考。
serversql去反斜杠_防⽌SQL注⼊可以简单的通过过滤反斜杠
后再转义实现么?
⼀、为什么会有SQL注⼊
是⽤户输⼊的内容在服务器中能够被拼接查询,从⽽输出恶意⽤户期望的内容,那么要防⽌SQL注⼊,就是阻⽌恶意⽤户输⼊的恶意信息被数据库执⾏并且输出。
1. 对于数字型注⼊,不需要单引号个的情况下
可以将payload跟在参数后边,不受过滤和转义的影响
$id=$_POST["id"];
$sql = select username from users where id= $id union select database();
2. 宽字节注⼊(但是要使⽤gbk编码)
在使⽤gbk编码时,系统会认为两个字符是⼀个汉字的编码(前⼀个字符必须⼤于128)。
输⼊%df%27时⾸先经过上⾯提到的单引号转义变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前由于使⽤了GBK多字节编码,即在汉字编码范围内两个字节会被编码为⼀个汉字。然后MySQL服务器会对查询语句进⾏GBK编码即%df%5c转换成了汉字“運”,⽽单引号逃逸了出来
3. 使⽤编码的形式
查询的数据在经过webserver时会被解码⼀次
id=1%2527 --->webserver --> id=1%27 --> urldecode--> 1"
4. ⼆次注⼊
⼆次注⼊漏洞字⾯上理解可能就是结合两个注⼊漏洞点实现sql注⼊的⽬的,但是这其中还有⼏个细节需要讲解⼀下。⾸先,第⼀个注⼊点因为经过过滤处理所以⽆法触发SQL注⼊漏洞,⽐如addslashes函数,将单引号等字符转义变成\’。但是存进数据库后,数据⼜被还原了,也就是反斜杠没了,在这种情况下,如果能发现⼀个新的注⼊同时引⽤了被插⼊了的数据库数据,就可以实现闭合新发现的注⼊漏洞引发漏洞。
⼆、如何防⽌SQL注⼊
通过上边的四种⽅式完美的绕过了反斜杠和单引号转义是否能防⽌SQL注⼊的问题,哪如何能防⽌SQL注⼊呢?
1、所有的查询语句都使⽤数据库提供的参数化查询接⼝,参数化的语句使⽤参数⽽不是将⽤户输⼊变量嵌⼊到SQL语句中。当前⼏乎所有的数据库系统都提供了参数化SQL语句执⾏接⼝,使⽤此接⼝可以⾮常有效的防⽌SQL注⼊攻击。
2、对进⼊数据库的特殊字符(’”<>&*;等)进⾏转义处理,或编码转换。
3、确认每种数据的类型,⽐如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4、数据长度应该严格规定,能在⼀定程度上防⽌⽐较长的SQL注⼊语句⽆法正确执⾏。
5、⽹站每个数据层的编码统⼀,建议全部使⽤UTF-8编码,上下层编码不⼀致有可能导致⼀些过滤模型被绕过。
6、严格限制⽹站⽤户的数据库的操作权限,给此⽤户提供仅仅能够满⾜其⼯作的权限,从⽽最⼤限度的减少注⼊攻击对数据库的危害。
7、避免⽹站显⽰SQL错误信息,⽐如类型错误、字段不匹配等,防⽌攻击者利⽤这些错误信息进⾏⼀些判断。
推荐访问: