PHP:了解SQL注入


PHP: Understand SQL Injection

我在旧网站上工作,在日志文件中发现了这个错误:

 Invalid SQL: SELECT COUNT(*) AS color_count FROM colors WHERE id IN (on,on) ;
  mysql error: You have an error in your SQL syntax; check the manual that corresponds to
  your MySQL server version for the right syntax to use near
  'on,on) ' at line 1

php代码如下:

$query  = "SELECT COUNT(*) AS color_count FROM colors WHERE id IN ";
$ids    = implode("','", $_GET['id_color']);
$query  .= "('".$ids."') ";

我通过添加mysql_real_escape_string解决了这个错误。

但我想了解SQL注入如何修改查询并从查询中删除简单引号'

SQL注入只能添加字符,不能从SQL字符串中删除字符。换句话说,它不是";SQL抽吸".:-)

我能想到这些可能性:

  • 日志中的错误发生在过去的某个日期,即代码引用之前。也许它最初被设计为只处理整数,而这些整数不需要被引用。

    我建议在日志中记录错误的日期/时间,然后从源代码管理中检索与该日期对应的代码版本。

  • 该错误是由代码的另一部分中的类似SQL查询生成的,其中代码未能引用值。

    我建议您在所有代码中搜索类似的SQL查询。

  • 您的代码(或框架)从SQL字符串中去掉单引号。我猜不出它为什么会这样做,但理论上这是有可能的。

SQL注入在任何允许用户输入直接放入语句的地方都是危险的(在其他情况下)。这就是绑定语句更安全和更受欢迎的原因。

要点是,如果我能在你的语句末尾添加输入,没有什么可以阻止我添加分号来结束你的当前语句,然后在同一变量中添加新语句。所以我的字符串可以是:

"11;Drop colors if exists cascade",天真的执行会执行两条语句,其中一条按预期完成,然后是恶意的删除表的语句。

现在,复选框不太可能成为注射的受害者,但它应该始终是一个问题。

对SQL注入做更多的研究,并真正理解它。然后你可以开始构建和修改代码,以更好地对抗它。

http://en.wikipedia.org/wiki/SQL_injection

如果您想打断单引号,它可以是' or '1'='1(http://en.wikipedia.org/wiki/SQL_injection)。