消除危险字符是否可以避免SQL注入?

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

  • 怎么可以打破?

Gum*_*mbo 9

为了能够从字符串文字的上下文中注入任意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注入.

  • @YourCommonSense这适用于SQL字符串文字中的所有注入点. (2认同)

You*_*nse 5

删除任何字符的想法是完全错误的.

这就是你的方法本质上是错误的.

您必须正确格式化SQL文本而不是破坏它们.

想象一下,这个网站正在使用这样的"保护":你无法发布你的问题!

从字面上回答你的问题 - 是的,在某些情况下,它很容易注入.仅仅因为一次性消毒的想法被打破了.PHP有一个类似的功能,称为"魔术引号".这是一个艰难的教训,但现在它终于从语言中删除了.由于我告诉你的原因:

  • 它不会使"数据""安全"
  • 它改变了你的数据

根据其角色,每个SQL文字都必须经过个人处理.

  • 对不起,我不讨论你想拍的特别的脚趾.你不应该自己开枪.期. (4认同)