不mysql_real_escape_string()充分保护对SQL注射?
-
10-07-2019 - |
题
上 http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this 有一个部分,索赔则可以绕过mysql_real_escape_string的某些亚文字编码
绕过mysql_real_escape_string()与BIG5或GBK
"注string"
に関する追加情報:上面的文字是中国Big5
这是真的吗?如果是这样,你会怎么保护你的网站对此,如果你没有准备好的发言?
解决方案
根据Stefan Esser的说法,当使用mysql_real_escape_string()
时, <!>“SET NAMES
[是]不安全。<!>
他的解释,来自他的博客:
SET NAMES通常用于将编码从默认编码切换到应用程序所需的编码。 这是以
mysql_real_escape_string
不会<!>#8217;知道这一点的方式完成的。这意味着如果你切换到一些允许反斜杠作为第二个第3个第4个<!>#8230的多字节编码;你遇到麻烦的字节,因为mysql_set_charset
没有<!>#8217; t正确转义。 UTF-8是安全的<!>#8230;更改编码的安全方法是<=>,但这仅适用于新的PHP版本
他确实提到UTF-8是安全的。
其他提示
这是一个MySQL server错误,据报道是固定的方式在可以2006年。
参见:
- MySQL错误#8303:字符串与多字的含\是lexed错误
- MySQL错误#8317:字符集引入器在查询失败复盖连接的角色设定
- MySQL错误#8378:串逃错误地与客户的字符集'gbk'
- 5.1.11区MySQL 志.
Bug的报告的固定在MySQL4.1.20,5.0.22,5.1.11区.
如果你使用4.1.x,5.0.x,或5.1.x,确保你已升级至少为未成年订正数字。
作为一种解决办法,还可以使SQL模式 NO_BACKSLASH_ESCAPES
禁止反斜杠,作为报价-逃符。
我很确定如果使用SQL来更改char编码,它只会起作用。
正如其他人所证明的那样, mysql_real_escape_string()
可以在不起眼的边缘情况下被绕过。这是绕过逃避逻辑的一种已知策略,但可能还有其他尚未发现的未知漏洞。
阻止PHP中的SQL注入是指使用预备语句,以及非常严格白名单。
准备好的语句,当实际使用而不是由PDO驱动程序模拟时,可证明是安全的(至少在SQL注入方面),因为它们解决了应用程序安全性的基本问题:它们分离了数据来自对数据进行操作的说明。它们是分开发送的;参数化的值永远不会有污染查询字符串。
这是2015年。不要再逃避和连接了。您仍应根据应用程序(和业务)逻辑验证输入,但只使用预准备语句。