每个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输入而设计的,他们不知道如何处理多字节?正如文章所指出的,保护测量成为失败的原因。
哦,请不要只是说使用准备好的陈述......已经知道这个优秀的选择。
这篇出色的令人大开眼界的文章大约十年前写成,有点过时了。 从那以后事情有所改善。 正如文档所述,PHP有一个控制mysql_real_escape_string()的功能,并使其真正“考虑到连接的当前字符集”。
问题严格不是来自GBK等多字节字符集,而是来自字符集误解。所以,你只需告诉mysql,你正在使用什么字符集。因此,检测多字节字符串毫无意义。
所以,只需使用mysql_set_charset()
设置正确的字符集,您就会安全。
这是a little demo I wrote on the topic。
还要记住,并非每个多字节编码都容易受到攻击。 utf-8非常安全。否则,我们今天遭受了数十次注射。