无论如何要停止接收潜在的多字节字符串

时间:2012-02-01 23:35:50

标签: character-encoding sql-injection multibyte

每秒this excellent eye-opener article 写一秒。专家,我对传入的字符串非常怀疑 - 由于mysql_real_escape_string可能被欺骗......

问题严格来自GBK等多字节字符集。如果用户输入不是多字节输入,那么,没有问题,没有问题,因为mysql_real_escape_string将足以对抗SQL注入 - 只要你正确地进行基本数据类型验证。

我不是说多字节是邪恶的......但如果你不必处理多字节情况,那就不要了。坚持使用utf-8,如果这对你有用,并且只是留在utf-8 ...但问题是如何?原因是,用户通过向您发送非utf-8字符串以及可能是GBK等多字节字符串来启动该过程...

如何确保您可以成功并可靠地拒绝该用户输入?从我读取/学习的内容来看,无法知道传入的用户字符串所处的字符集。那么什么?

换句话说,您如何确保使用utf-8用户字符串?我问这个是因为所有的PHP过滤/清理功能都是为了处理utf-8输入而设计的,他们不知道如何处理多字节?正如文章所指出的,保护测量成为失败的原因。

哦,请不要只是说使用准备好的陈述......已经知道了这个优秀的选择。

1 个答案:

答案 0 :(得分:2)

这篇出色的令人大开眼界的文章大约十年前写成,有点过时了 从那以后事情有所改善 正如文档所述,PHP有一个控制mysql_real_escape_string()的函数,并使真正“考虑到连接的当前字符集”。

问题严格不是来自GBK等多字节字符集,而是来自字符集误解释。所以,你只需告诉mysql,你正在使用什么字符集。因此,检测多字节字符串毫无意义。

因此,只需使用mysql_set_charset()设置正确的字符集即可。

这是a little demo I wrote on the topic

另请注意,并非每个多字节编码都容易受到攻击。 utf-8非常安全。否则,我们今天遭受了数十次注射。