【发布时间】:2018-06-30 13:32:37
【问题描述】:
我想通过检查 SQL 查询来检测可能的 SQL 注入攻击。我正在使用 PDO 和准备好的声明,所以希望我没有被别人攻击的危险。但是,我要检测的是输入/结果查询字符串可能成为危险查询的可能性。例如,我的应用程序——正确地——永远不会生成“1=1”查询,所以我可以检查生成的查询字符串,并标记产生该查询的用户/IP。与“drop table”相同,但也许我只能通过循环输入数组来检查;或者也许我应该重新检查生成的查询。我正在使用 MySQL,但也感谢其他驱动程序的模式。
我已经阅读了RegEx to Detect SQL Injection 并且一些 cmets 正朝着这个方向前进。在我的帮助下,我正在为很少使用英语作为输入的用户进行开发,因此查询上的简单 /drop/ 匹配可能足以记录用户/查询以供进一步检查。我在研究 SQL 注入时发现的一些模式是:
- 句子中间的分号 -- 虽然这可能很常见
- 双破折号/井号用于评论查询的其余部分
- 在值的开头和结尾使用引号
- 使用十六进制(我的目标用户在他们的表单中输入 0x 的机会很小甚至很低)
- declare/exec/drop/1=1(我的应用不应生成这些值)
- html 标签(来自预期用户/用例的可能性很小)
- 等
通过在生成查询字符串之前循环输入值更容易检测到上述所有内容,因为它们没有被转义。但我错过了多少? (很多,我猜)我应该检查任何其他晦涩的模式吗?检查生成的查询怎么样?任何可能出现的模式?
tl;dr:什么模式可以匹配 SQL 查询(MySQL)来检查可能的注入?我将 PDO 与准备好的语句和值绑定一起使用,因此检查用于记录/警报目的。
【问题讨论】:
-
使用参数。那你就不用担心SQL注入了。
-
答案与您链接中的答案相同:“不要这样做。您实际上肯定会失败。请改用 PreparedStatement(或其等效项)。”
-
我不太担心注射。我想知道是否有任何用户尝试“注入”应用程序。
标签: mysql sql regex design-patterns code-injection