mas*_*oud 7 php security sql-injection
有许多出色的方法来保护应用程序免受SQL注入,例如,此问答显示了一些方法如何防止PHP中的SQL注入?.
这个问题是关于已经编写的应用程序.我们不想修改它以提高其安全性.我们想知道所使用的方法是否容易受到注入攻击.
我们需要知道这部分代码是否泄漏数据的原因?
这是一个PHP函数,以消除一些无用的(对我们来说)和可能有害的字符:
function removeBadCharacters($s)
{
return str_replace(array('&','<','>','/','\\','"',"'",'?','+'), '', $s);
}
Run Code Online (Sandbox Code Playgroud)
它会抛出危险的字符以避免SQL注入攻击(不要担心删除的字符,例如removeBadCharacters应用程序不需要它们):
$x = removeBadCharacters($_POST['data']);
mysql_query("insert into table (x) values ('".$x."');");
// or
mysql_query("select * from into where name = '".$x."';");
Run Code Online (Sandbox Code Playgroud)
是否足以使查询安全?
有没有办法绕过removeBadCharacters?
怎么可以打破?
为了能够从字符串文字的上下文中注入任意SQL ,需要保留该字符串文字.这只能通过引入字符串结束分隔符(在本例中为单个分隔符)'或通过将字符串文字扩展为前一个'(例如,通过使用转义字符)来实现\:
$a = '\\';
$b = ' OR 1=1 OR ';
$c = ' --';
$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='\' AND b=' OR 1=1 OR ' AND c=' --'
// \_________/ \_______/
Run Code Online (Sandbox Code Playgroud)
现在,当你的函数删除任何'和\,似乎是不可能离开或扩展字符串文字,因此不可能注入任意SQL.
但是,由于您的函数没有考虑实际的字符编码,因此如果MySQL的字符编码是GBK,则可以利用它addslashesmysql_real_escape_string,类似于在使用时可以利用它而不是:
$a = "\xbf";
$b = " OR 1=1 OR ";
$c = " --";
$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='? AND b=' OR 1=1 OR ' AND c=' --'
// \_________/ \_______/
Run Code Online (Sandbox Code Playgroud)
因此,要安全,使用mysql_real_escape_string或其他经过验证的方法来防止SQL注入.
这就是你的方法本质上是错误的.
您必须正确格式化SQL文本而不是破坏它们.
想象一下,这个网站正在使用这样的"保护":你无法发布你的问题!
从字面上回答你的问题 - 是的,在某些情况下,它很容易注入.仅仅因为一次性消毒的想法被打破了.PHP有一个类似的功能,称为"魔术引号".这是一个艰难的教训,但现在它终于从语言中删除了.由于我告诉你的原因:
根据其角色,每个SQL文字都必须经过个人处理.