Chinaunix
标题:
mysql中"set character_set_client=BINARY"的作用到底是什么?
[打印本页]
作者:
danieluec
时间:
2018-01-15 20:36
标题:
mysql中"set character_set_client=BINARY"的作用到底是什么?
rt,为了防止宽字节,很多资料上都说可以在客户端设置“set character_set_client=BINARY”,但是这句话的含义到底是什么呢?假如我目前客户端的程序是这么设置的:
<?php
mysqli_query($conn, "set character_set_connection=GBK,set character_set_results=GBK,set character_set_client=BINARY");
...
...
?>
作者:
seesea2517
时间:
2018-01-16 15:27
本帖最后由 seesea2517 于 2018-01-16 16:45 编辑
没怎么用过php,不过看着应该就用 set names 来统一设置三者字符集就可以了。
你这个设置是客户端单独用不同的字符集,二进制字符集就是不做转换,直接存储、传输字节内容。由于你的配置里连接用的是 GBK,那么传到客户端来的数据也就用 GBK 来解释了。
BINARY:二进制字符集相关说明:
https://dev.mysql.com/doc/refman/5.7/en/charset-binary-set.html
php 连接设置的FAQ:
https://dev.mysql.com/doc/refman ... gui-not-display-cjk
作者:
danieluec
时间:
2018-01-16 16:21
@seesea2517 谢谢了!如果用“set names GBK”的话,是存在宽字节注入漏洞的。比如发起请求"http://xxx.com/index.php?a=%df'"。经服务端转义后,a的值会变成%df%5c',而%df%5c是一个汉字,这相当于把单引号给逃离出来了,可以发起sql注入攻击。
如果设置“character_set_client=BINARY”,即使“不做转换、直接存储”,那么mysql在解析sql之前,sql中a的内容还是%df%5c',按照这个逻辑,按说还是存在漏洞的。因此还是想不明白在防御攻击的角度上,这个binary为什么能防住。
作者:
danieluec
时间:
2018-01-16 16:23
@seesea2517 谢谢了!如果用“set names GBK”的话,是存在宽字节注入漏洞的。比如发起请求:
http://xxx.com/index.php?a=%df'
复制代码
经服务端转义后,a的值会变成%df%5c',而%df%5c是一个汉字,这相当于把单引号给逃离出来了,可以发起sql注入攻击。
如果设置“character_set_client=BINARY”,即使“不做转换、直接存储”,那么mysql在解析sql之前,sql中a的内容还是%df%5c',按照这个逻辑,按说还是存在漏洞的。因此还是想不明白在防御攻击的角度上,这个binary为什么能防住。
作者:
danieluec
时间:
2018-01-16 16:31
谢谢了!如果用“set names GBK”的话,是存在宽字节注入漏洞的。比如发起请求:
http://xxx.com/index.php?a=%df'
复制代码
经服务端转义后,a的值会变成%df%5c',而%df%5c是一个汉字,这相当于把单引号给逃离出来了,可以发起sql注入攻击。
如果设置“character_set_client=BINARY”,即使“不做转换、直接存储”,那么mysql在解析sql之前,sql中a的内容还是%df%5c',按照这个逻辑,按说还是存在漏洞的。因此还是想不明白在防御攻击的角度上,这个binary为什么能防住。
作者:
danieluec
时间:
2018-01-16 19:40
谢谢了!如果用“set names GBK”的话,是存在宽字节注入漏洞的。比如发起请求:
http://xxx.com/index.php?a=%df'
复制代码
经服务端转义后,a的值会变成:
%df%5c'
复制代码
而%df%5c是一个汉字,这相当于把单引号给逃离出来了,可以发起sql注入攻击。
如果设置character_set_client=BINARY,即使不做转换、直接存储,那么mysql在解析sql之前,sql中a的内容还是:
%df%5c'
复制代码
按照这个逻辑,按说还是存在漏洞的。因此还是想不明白在防御攻击的角度上,这个binary为什么能防住。
作者:
danieluec
时间:
2018-01-16 19:41
谢谢了!如果用“set names GBK”的话,是存在宽字节注入漏洞的。比如发起请求:
http://xxx.com/index.php?a=%df’
复制代码
经服务端转义后,a的值会变成:
%df%5c’
复制代码
而%df%5c是一个汉字,这相当于把单引号给逃离出来了,可以发起sql注入攻击。
如果设置character_set_client=BINARY,即使不做转换、直接存储,那么mysql在解析sql之前,sql中a的内容还是:
%df%5c’
复制代码
按照这个逻辑,按说还是存在漏洞的。因此还是想不明白在防御攻击的角度上,这个binary为什么能防住。
作者:
danieluec
时间:
2018-01-17 08:30
本帖最后由 danieluec 于 2018-01-17 08:32 编辑
谢谢~
从安全的角度看,如果二进制字符集就是不做转换、直接存储、传输字节,那么按照mysql的编码转换流程(client->connection->server),将client的编码设置为binary也是防不住注入漏洞的。所以想弄明具体binary的功能和整个编码过程。
作者:
seesea2517
时间:
2018-01-17 09:33
回复
20#
danieluec
防注入应该有一些相关的专题文章或讨论,楼主有发现有价值的欢迎分享给大家哈。
作者:
王楠w_n
时间:
2018-01-17 11:28
回复
1#
danieluec
回帖以标注成精华帖,感谢您对社区内容的贡献
作者:
魅力舞兵
时间:
2019-04-04 11:53
厉害,高手中的高手
球墨铸铁管厂家
作者:
魅力舞兵
时间:
2019-04-15 13:04
感谢您对社区内容的贡献
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2