我想通过检查SQL查询来检测可能的SQL注入攻击。我正在使用 PDO 和准备好的声明,所以希望我不会面临被某人攻击的危险。但是,我想要检测的是输入/结果查询字符串可能成为危险查询的可能性。例如,我的应用程序——正确地——永远不会生成“1=1”查询,因此我可以检查生成的查询字符串,并标记生成该查询的用户/IP。与“drop table”相同,但也许我只能通过循环输入数组来检查;或者也许我应该再次检查生成的查询。我正在使用 MySQL,但其他驱动程序的模式也很受欢迎。
我已经阅读了RegEx to Detect SQL Injection并且一些评论正朝着这个方向发展。在我的帮助下,我正在为很少使用英语作为输入的用户进行开发,因此查询上的简单 /drop/ 匹配可能足以记录用户/查询以供进一步检查。我在研究 SQL 注入时发现的一些模式是:
在生成查询字符串之前通过循环输入值更容易检测到上述所有内容,因为它们没有被转义。但我错过了多少? (我猜很多)我还应该检查其他晦涩的模式吗?检查生成的查询怎么样?可能会出现什么模式?
tl;dr:什么模式可以匹配 SQL 查询(MySQL)来检查可能的注入?我将 PDO 与准备好的语句和值绑定一起使用,因此检查用于记录/警报目的。
在我的店里,我们有两条规则。
intval()
作为整数参数,也可以使用适当的函数根据其应用程序数据类型来清理字符串变量。例如,个人姓名可能是 Jones
或 O'Brien
或 St. John-Smythe
,但绝不会包含撇号 '
、连字符 -
、空格或点 .
以外的特殊字符 产品编号可能只包含字母或数字。等等。如果 2 太难,请遵循规则 1。
我们检查代码以确保我们正在做这些事情。
但是我错过了多少?
你猜对了。创建一个巨大的黑名单并不会让你的代码免受影响。这种方法已经成为历史。其他问题遵循同样的思路。
您最好的选择是:
几步却刀枪不入。
不可能。
你将在军备竞赛中度过余生——你建立防御,他们制造更好的武器,然后你建立防御,等等。
SELECT
。root
登录重新发起攻击。SET
陈述呢?LOAD DATA
。相反,决定您允许的最小查询集,然后对其进行参数化,以便您可以单独检查或转义各个部分。然后构建查询。