我在旧网站上工作,我在日志文件中发现了这个错误:
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注入如何修改查询并从查询中删除简单引号'
?
答案 0 :(得分:2)
SQL注入只能添加字符,不能从SQL字符串中删除字符。换句话说,它不是“SQL吸”。 : - )
我可以想到这些可能性:
日志中的错误发生在您的代码引用之前的过去日期。也许它最初设计为只处理整数,这些整数不需要引用。
我建议在日志中注明错误的日期/时间,然后从源控件中检索与该日期对应的代码版本。
错误是由代码的另一部分中的类似SQL查询生成的,其中代码无法引用值。
我建议您搜索所有代码以查找类似的SQL查询。
您的代码(或您的框架)从SQL字符串中删除单引号。我不明白为什么会这样做,但理论上它是可能的。
答案 1 :(得分:0)
在允许用户输入直接放入语句的任何地方,SQL注入都是一种危险(在其他情况下)。这就是绑定语句更安全和首选的原因。
它的要点是,如果我可以在语句结尾处输入输入,那么就没有什么可以阻止我添加分号来结束当前语句,然后在同一个变量中添加一个新语句。所以我的字符串可能是:
" 11;如果存在级联,则删除颜色"一个天真的执行将执行两个语句,其中一个语句按预期完成,然后是删除表的恶意语句。
现在,一个复选框可能不是注射的受害者,但它应该始终是一个问题。
对SQL注入做一些更多的研究,并且真正理解它。然后,您可以开始构建和修改代码以更好地对抗它。
答案 2 :(得分:0)
如果你想打破单引号(http://en.wikipedia.org/wiki/SQL_injection),它可以是' or '1'='1
。