一般程序员用gbk编码做开发的时候,会用 set names 'gbk'
来设定,
这句话等同于
set character_set_connection = 'gbk', character_set_result = 'gbk', character_set_client = 'gbk';
漏洞发生的原因是执行了 set character_set_client = 'gbk';
之后,mysql就会认为客户端传过来的数据是gbk编码的,
从而使用gbk去解码,而mysql_real_escape是在解码前执行的。
但是直接用 set names 'gbk'
的话real_escape是不知道设置的数据的编码的,就会加 %5c
。
此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。
解决的办法有三种,第一种是把client的charset设置为binary,就不会做一次解码的操作。
第二种是是 mysql_set_charset('gbk')
,这里就会把编码的信息保存在和数据库的连接里面,
就不会出现这个问题了。
第三种就是用pdo。
还有一些其他的编码技巧,比如latin会弃掉无效的unicode,
那么admin%32在代码里面不等于admin,
在数据库比较会等于admin。
本文发布于:2024-02-04 07:41:14,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170702213553614.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |