常见字符集
ascii字符集(包含全部应为和标点符号)
GB2312字符集(中文字符集-早)
BIG5字符集(台湾繁体字)
GB18030字符集(中国汉字编码国家标准-全面)
Unicode字符集等(通用多八位编码字符集,支持各种不同语言的书面文本的交换、处理及显示)
编码方式
Ascii 127个字符 8位(单字节)
中文编码 16位 (宽字节)
Unicode编码 2-4字节 16-64位
utf-8编码 英文8位(一个字节) 中文24位(三个字节)
gbk编码汉字,占用2个字节(宽字节)
解决乱码问题
▪ addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。addcslashes() 函数对大小写敏感。
- 注释:对以下字符应用 addcslashes() 时请小心:0(NULL), r(回车), n(换行), f 换页)、t(制表符)以及 v(垂直制表符)。在 PHP 中,\0, \r, \n, \t, \f 以及 \v 是预定义的转义序列。
▪ stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
- 提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据。
▪ mysql_real_escape_string()
- 函数转义 SQL 语句中使用的字符串中的特殊字符。如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
宽字节安全问题
宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。
1、想办法把\去掉
mysql 特性:mysql 在使用GBK 编码的时候,会认为两个字符是一个汉字(前一个ascii 码要大于128,gbk的汉字的范围)。
▪ 输入%df%27时,%27是’会被转移为\’,而\的编码为%5c,最后就变成了%df %5c%27,由于%df(这里16进制)>128(ascii码值),mysql就认为前两个编码是一个汉字,運,最后结果就编程了運’,成功吃掉了转义的反斜杠\
▪ 实际上,只要编码值大于128,均可以实现吃掉\。例如%81,%82,%83等等。
2、转义反斜杠
錦 的UTF-8编码为: %E9%8C%A6
錦 的GBK编码为: %e5%5c
▪ 实用:直接输入%E9%8C%A6%27或%e5%5c%27
▪ 原理:%e5\’(即%e5%5c%27)→%e5%5c%5c%5c%27→錦\\’,这样反斜杠就被转义了。
宽字节防御问题
方案一、先调用mysql_set_charset函数设置连接所使用的字符集为gbk,再调用mysql_real_escape_string来过滤用户输入
方案二、将character_set_client设置为binary(二进制)。只需在所有sql语句前指定一下连接的形式是二进制:
▪ mysql_query("SET character_set_connection=gbk, character_set_results=gbk,character_set_client=binary", $conn);