合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] ## 原理 当客户端发送到服务端的时候运用一种编码,服务端发送到数据库的时候又运用了一种编码,返回到客户端的时候运用了一种编码 php后台的编码与数据库的编码不一致,或者经过一些编码函数(如iconv) 进行转换处理,导致可以使用宽字节,绕过转义字符,完成闭合,导致sql注入 ## 编码格式 指Unicode编码,存储方式采用UTF-16。因为只有2字节和4字节两种情况,故用wchar\_t,占两个字节。 ## 使用场景 当后台程序对于传入的数据的数据进行了转义时,需要运用到闭合的时候 ## 使用方法 一个GBK汉字占两个字节,每个字节有自己的取值范围,如果设置GBK编码 后,遇到连续两个字节,都符合GBK取值范围,会自动解析为一个汉字 输入%df%27,本来会转义%27为\\\’,但\\\遇上%df相当于%5c和%df相遇, 两者会合起来被解析成一个汉字(運),这样变成 id=‘1運’,在MYSQL中效果等同于 id=‘1’,因而成功绕过 ## 防御方法 ~~~ 使用 mysql_set_charset(GBK) 指定字符集 使用 mysql_real_escape_string 进行转义 ~~~ 原理是,mysql_real_escape_string 与 addslashes 的不同之处在于其会考虑当前设置 的字符集,不会出现前面 df 和 5c 拼接为一个宽字节的问题 但是这个“当前字符集”如何确定呢,就是使用 mysql_set_charset 进行指定,以上两 个条件要同时满足