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

vptzau2j  于 2022-09-18  发布在  Java
关注(0)|答案(9)|浏览(192)

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

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

fnx2tebb

fnx2tebb1#

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

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

因此,总的来说,没有办法做到这一点,甚至是接近可靠的。

rkkpypqq

rkkpypqq2#

答案很简单,那就是你不能。只要编写代码,假设发球会受到重击,那么你就不会出错。

6tr1vspr

6tr1vspr3#

This is a very hard problem to solve, automatically detecting which SQL queries are attacks (or simple mistakes).

There are companies who make products that attempt to do this, like GreenSQL and DB Networks ADF-4200, by applying heuristic tests to see if queries look "suspicious."

But even they rely more on whitelisting the queries that your application runs. The heuristics are known to have both false positives and false negatives. And there are whole categories of queries that neither whitelisting nor heuristics can catch, like calls to stored procedures.

Someone mentioned mod_security too, but this requires a lot of configuration, and then you're back to hand-coding rules for whitelisting your application's legitimate queries.

Just follow good practices like parameterizing and whitelisting, so that user input (or any untrusted content) is never evaluated as code.

tvmytwxo

tvmytwxo4#

其实并没有什么确定的办法!
但是猜测攻击是有可能的!
只需检查最常用的完整SQL注入结构,例如,在您的输入中扫描这个词(不区分大小写):

union
select
drop
--
;

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

zazmityj

zazmityj5#

测试‘--’和‘;’字符串...也可能是OR,AND,(,等等。但你永远不能百分之百确定这是一次攻击。

nfzehxib

nfzehxib6#

我想说,在编写代码时假设所有用户输入都是攻击,并使您的程序足够安全以减轻攻击,比试图追溯修复可能是或可能不是攻击的东西更安全。

kiz8lqtg

kiz8lqtg7#

您可以尝试以下操作:

1.如果输入字符串中没有要转义的字符,则不是攻击企图。
1.将用户输入放入不带引号的查询中。
1.尝试检查查询语法而不运行(例如让MySQL以某种方式为您执行(?))。
1.如果没有语法错误,则这是一次攻击尝试。

但通过这种方式,您只能检测到可能成功的攻击尝试,而不是那些会导致解析错误的攻击尝试。

tyg4sfes

tyg4sfes8#

您可以搜索某些密钥(uniondeletedrop...)等。如果您确定原始查询永远不会有--\n(新行),请搜索它们。创建一个总是返回一些值的查询--如果用户恶意输入,则不会返回,这可能表示发生了攻击。

但因为用户往往会犯错或攻击服务器(数字,我会写信检查它会造成多大的混乱……)所有用户输入在使用之前都应经过过滤。

ljo96ir5

ljo96ir59#

(笑话删除)

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

1.如果输入字符串中没有要转义的字符,则不是攻击企图。
1.将用户输入放入不带引号的查询中。
1.尝试检查查询语法而不运行(例如让MySQL以某种方式为您执行(?))。
1.如果没有语法错误,则这是一次攻击尝试。

但通过这种方式,您只能检测到可能成功的攻击尝试,而不是那些会导致解析错误的攻击尝试。

相关问题