PHP:了解SQL注入

时间:2014-04-24 15:53:02

标签: php mysql 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注入如何修改查询并从查询中删除简单引号'

3 个答案:

答案 0 :(得分:2)

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

我可以想到这些可能性:

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

    我建议在日志中注明错误的日期/时间,然后从源控件中检索与该日期对应的代码版本。

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

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

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

答案 1 :(得分:0)

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

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

" 11;如果存在级联,则删除颜色"一个天真的执行将执行两个语句,其中一个语句按预期完成,然后是删除表的恶意语句。

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

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

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

答案 2 :(得分:0)

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