如何确定用户是否尝试SQL注入攻击

时间:2011-08-12 23:48:20

标签: php mysql sql-injection

我熟悉使用mysql_real_escape_string()和PHP FILTER_SANITIZE函数来阻止sql注入。

但是,我很好奇我将如何在PHP脚本中确定用户输入是否可能是SQL注入尝试?这对于跟踪潜在的恶意IP非常有用。

9 个答案:

答案 0 :(得分:6)

如果mysql_real_escape_string的输出与输入不同,则输入包含不安全的字符。您可以推断用户可能一直在尝试攻击,特别是如果相关字段是您通常期望较少数量的不安全字符(例如邮政编码)的字段。

但也可能是因为他们的名字恰好是Robert'); DROP TABLE Students; --

所以一般来说,没有办法做到这一点甚至接近可靠。

答案 1 :(得分:2)

简单的答案是你不能。只需编写代码,假定服务器会受到冲击,那么就不会出错。

答案 2 :(得分:2)

这是一个非常难以解决的问题,可以自动检测哪些SQL查询是攻击(或简单的错误)。

有些公司通过应用启发式测试来查看查询是否“可疑”,从而制作尝试执行此操作的产品,例如GreenSQLDB Networks ADF-4200

但即使他们更依赖于将应用程序运行的查询列入白名单。众所周知,启发式方法既有误报,也有假阴性。并且有一些类别的查询,白名单和启发式都不能捕获,比如对存储过程的调用。

有人提到mod_security,但这需要大量配置,然后您又回到手工编码规则,将应用程序的合法查询列入白名单。

只需遵循参数化和白名单等良好做法,即不会将用户输入(或任何不受信任的内容)评估为代码。

答案 3 :(得分:0)

测试' - '和';'字符串......也许还有OR,AND,(等等。但你永远不能100%确定它是一种攻击。

答案 4 :(得分:0)

我认为假设所有用户输入在您编写代码并使您的程序足够安全以缓解攻击而不是尝试追溯修复可能或可能不是攻击的内容时,更安全。 / p>

答案 5 :(得分:0)

其实没有办法!
但有可能猜测攻击!
只需检查最常见的有用的SQL注入结构 例如,在输入中扫描这些单词(不区分大小写):

union
select
drop
--
; 

如果你知道如何停止sql注入,你不应该担心,你可以安全地运行查询。但据我了解你想要检测注射,所以我更喜欢你只记录可疑输入,然后手动决定!在大多数情况下,记录的查询是真实的注入。

答案 6 :(得分:0)

您可以尝试以下操作:

  1. 如果输入字符串中没有要转义的字符,那么 这不是攻击企图。
  2. 将用户输入放在查询中,不用引用。
  3. 尝试检查查询语法而不运行(例如,让mysql以某种方式为你做(?))。
  4. 如果没有语法错误,那就是攻击企图。
  5. 但是这样你只能检测到可能成功的攻击企图,而不是那些给出解析错误的企图。

答案 7 :(得分:0)

您可以搜索某些键(uniondeletedrop...)等。如果您确定原始查询永远不会拥有它,请搜索--\n(新行)。创建一个始终返回某个值的查询 - 如果使用用户恶意输入,则不会指示攻击。

但是因为用户总是会犯错误或攻击服务器(数字,我会写信来检查它会造成多少混乱......)所有用户输入都应该在使用前进行过滤。

答案 8 :(得分:-4)

(笑话删除)

编辑:您可以尝试以下操作:

  1. 如果输入字符串中没有要转义的字符,那么 这不是攻击企图。
  2. 将用户输入放在查询中,不用引用。
  3. 尝试检查查询语法而不运行(例如,让mysql以某种方式为你做(?))。
  4. 如果没有语法错误,那就是攻击企图。
  5. 但是这样你只能检测到可能成功的攻击企图,而不是那些给出解析错误的企图。