我有这个我正在使用的功能,我想确保它完全防止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