当启用modsecurity crs sql注入时,提交表单被禁止

我的网站打开了Ubuntu 16,Apache 2.4,PHP 5.6,我使用CMS Drupal 8

我安装了模块mod_security。 我激活它,然后我启用了modsecurity_crs_41_sql_injection_attacks.conf

对于每一个表格,当我提交时,我有一个错误403禁止

你能向我解释为什么所有的提交表格都是被禁止的吗?

编辑:添加Apache错误日志

 [Wed Nov 15 16:53:03.324516 2017] [:error] [pid 27760] [client] ModSecurity: Access denied with code 403 (phase 2). Pattern match "([\\\\~\\\\!\\\\@\\\\#\\\\$\\\\%\\\\^\\\\&\\\\*\\\\(\\\\)\\\\-\\\\+\\\\=\\\\{\\\\}\\\\[\\\\]\\\\|\\\\:\\\\;\\"\\\\'\\\\\\xc2\\xb4\\\\\\xe2\\x80\\x99\\\\\\xe2\\x80\\x98\\\\`\\\\<\\\\>].*?){4,}" at ARGS_NAMES:field_cl_address[0][format]. [file "/usr/share/modsecurity-crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "159"] [id "981173"] [rev "2"] [msg "Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded"] [data "Matched Data: ] found within ARGS_NAMES:field_cl_address[0][format]: field_cl_address[0][format]"] [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [hostname "www.d8.dev.xxxx"] [uri "/node/add/occlient/19784"] [unique_id "Wgxw738AAQEAAGxw91sAAAAO"] 

好,让我们分解它。

规则981173是导致问题的规则。 这是标记,因为

“受限SQL字符exception检测警报 – 超过特殊字符总数”

它甚至告诉你这个问题的领域:

在ARGS_NAMES:field_cl_address [0] [format]:field_cl_address [0] [format]“]中find[data”Matched Data:

这个规则的运行方式是在每个字段上运行一个非常长的正则expression式,并检查4个或更多的特殊字符(包括[和])。 有很多特殊字符的字段可能表明某人正在尝试绕过服务器或软件可能执行的基本检查,通过混淆不良的有效负载或转义字符。

但是,对于您的字段名称包含2个[字符和2]字符,这等于4个特殊字符限制,因此每个请求都被阻止。 这个规则,因为这个原因,你保护这个forms是没有用的。

OWASP通用规则集(CRS)是一组规则,是一组build议规则,不适合每个站点,在阻止模式下切换之前需要进行调整。

在CRS第3版中,规则981173被重新编号为942430(由于我不会在这里进行的理由,规则被重新编号为第3版的一部分),并增加了必须匹配的特殊字符的数量4到12,以避免像这样的误报。 说实话,如果你只是第一次安装CRS,那么你应该首先转到版本3,因为他们做了很多工作,使安装更容易,并避免这样的误报。

如果你现在想继续使用2.9版,那么你的select是:

  1. 通过包括以下configuration停止使用此规则:

    SecRuleRemoveById 981173

  2. 停止检查这个特定的领域,包括以下configuration:

    SecRuleUpdateTargetById 959071 !ARG_NAMES:'field_cl_address[0][format]'

  3. 手动编辑规则将{4,}更改为{12,}以便在此规则触发前您需要更多的匹配。 通常不build议直接编辑规则,而是最好有一个覆盖configuration文件,并使用它来修改规则 – 就像前面两个例子一样。 不幸的是,没有办法改变一个规则id的正则expression式,所以手动编辑是唯一的select(或打开该规则,并复制到一个新的规则与调整你的覆盖configuration)。

首先closures规则可能看起来很奇怪,但这正是在ModSecurity中对规则集进行微调的意义 – closures那些对您无用的规则,或者调整它们以避免在某些已知字段上触发。 它是否降低了ModSecurity和CRS提供的安全性? 是的,但是一个完全不起作用的安全网站并没有那么有用,而且对于除了最简单的站点之外的所有站点都需要修改CRS(特别是SQL注入规则)。

规则981173是我通常完全closures的规则,因为它很容易出现误报。 我前一段时间写了这篇文章关于其他常见的调整,我停止过度阻塞的CRS 2.9: https : //stackoverflow.com/questions/33989273/modsecurity-excessive-false-positives#answer-34027786

最后,我真的推荐ModSecurity手册(最近更新到第二版),以了解更多关于这一切如何工作: https : //www.feistyduck.com/books/modsecurity-handbook/

谢谢@BazzaDP

我遵循你的build议,运行良好。

另外,我删除了一些其他的规则ID

 <IfModule security2_module> SecRuleRemoveById 973300 SecRuleRemoveById 981245 SecRuleRemoveById 981248 SecRuleRemoveById 981173 SecRuleRemoveById 981231 SecRuleRemoveById 950901 SecRuleRemoveById 981260 </IfModule>