我在旧网站上工作,在日志文件中发现了这个错误:
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)。