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年。

参见:

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年。不要再逃避和连接了。您仍应根据应用程序(和业务)逻辑验证输入,但只使用预准备语句。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top