这个PHP函数是否可以防止SQL注入?

Nat*_*man 2 php sql-injection

我有这个我正在使用的功能,我想确保它完全防止SQL注入攻击:

function MakeSafeForQuery($string)
{
    // replace all of the quote
    // chars by their escape sequence

    $ret = str_replace("\\","\\\\",$string);
    $ret = str_replace("'","\\'",$ret);
    $ret = str_replace("\"","\\\"",$ret);

    return $ret;
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么严肃的事吗?

编辑:我顺便使用MySQL.

小智 10

在GBK中,0xbf27不是有效的多字节字符,而是0xbf5c.解释为单字节字符,0xbf27是0xbf(¿)后跟0x27('),0xbf5c是0xbf(¿)后跟0x5c(\).

这有什么用?如果我想针对MySQL数据库尝试SQL注入攻击,使用反斜杠转义单引号是一件好事.addslashes()但是,如果你正在使用,我很幸运.我需要做的就是注入像0xbf27这样的东西,并addslashes()修改它成为0xbf5c27,一个有效的多字节字符后跟一个引号.换句话说,尽管你逃脱了,我仍然可以成功地注入一个单一的报价.那是因为0xbf5c被解释为单个字符,而不是两个.糟糕,有反斜杠.

任何字符编码都可能发生这种类型的攻击,其中有一个以0x5c结尾的有效多字节字符,因为addslashes()可以欺骗创建有效的多字节字符而不是转义后面的单引号.UTF-8不符合此描述.

要避免此类漏洞,请使用 mysql_real_escape_string()

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string