mysql_real_escape_string() 是否完全防止 SQL 注入?

2022-08-30 12:43:27

http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this ,有一个部分声称您可以使用某些亚洲字符编码绕过mysql_real_escape_string

使用 BIG5 或 GBK 绕过 mysql_real_escape_string()

“injection string”
に関する追加情報:

以上字符是中国大5

这是真的吗?如果是这样,如果您无法访问准备好的声明,您将如何保护您的网站免受这种情况的影响?


答案 1

根据Stefan Esser的说法,“当使用SET NAMES,mysql_real_escape_string()[是]不安全的。

他的解释来自他的博客

SET NAMES 通常用于将编码从默认编码切换到应用程序需要的编码。这是以一种不知道这一点的方式完成的。这意味着,如果您切换到一些允许反斜杠作为 2nd 3rd 4th 的多字节编码...字节你遇到麻烦,因为没有正确转义。UTF-8 是安全的...mysql_real_escape_stringmysql_real_escape_string

更改编码的安全方法是 ,但这仅在新的 PHP 版本中可用mysql_set_charset

不过,他确实提到UTF-8是安全的。


答案 2

这是一个MySQL服务器错误,据报道早在2006年5月就已修复。

看:

据报道,MySQL 4.1.20、5.0.22、5.1.11 中修复了该错误。

如果使用 4.1.x、5.0.x 或 5.1.x,请确保至少已升级到次要修订版号。

作为一种解决方法,您还可以启用 SQL 模式NO_BACKSLASH_ESCAPES该模式禁用反斜杠作为引号转义字符。


推荐