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

问题描述 投票:1回答:1

每个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输入而设计的,他们不知道如何处理多字节?正如文章所指出的,保护测量成为失败的原因。

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

character-encoding sql-injection multibyte
1个回答
2
投票

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

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

所以,只需使用mysql_set_charset()设置正确的字符集,您就会安全。

这是a little demo I wrote on the topic

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

© www.soinside.com 2019 - 2024. All rights reserved.