在ModSecurity中, PCRE limits exceeded
错误。
我知道我可以通过设置规则来解决这个问题,例如:
SecPcreMatchLimit 150000 SecPcreMatchLimitRecursion 150000
但是,这些规则究竟在做什么呢? PCRE限制recursion设置为150,000是什么意思? 我可以通过设置这么高的安全漏洞? recursion
和limit
是什么意思?
我知道这里有文档,但是文档实际上并没有告诉我发生了什么,它只是告诉我如何处理这些指令。
这些似乎是PCRE引擎内部的设置,以限制尝试将某些文本与模式匹配所花费的最大内存/时间。 pcreapi
没有用外行的话来解释:
match_limit字段提供了一种防止PCRE在运行不匹配的模式时使用大量资源的手段,但是它们在search树中具有非常多的可能性。 经典的例子是使用嵌套无限重复。
在内部,PCRE使用称为match()的函数,它重复调用(有时是recursion的)。 match_limit设置的限制是在匹配过程中调用此函数的次数,这会限制可能发生的回溯量。 对于未锚定的模式,计数从主题string中的每个位置的零开始重新计数。
PCRE生成时,可以设置限制的默认值; 默认的默认值是1000万,它可以处理除极端情况以外的所有情况。 您可以通过在设置了match_limit的pcre_extra块中提供pcre_exec()来覆盖缺省值,并在flags字段中设置PCRE_EXTRA_MATCH_LIMIT。 如果超出限制,pcre_exec()返回PCRE_ERROR_MATCHLIMIT。
match_limit_recursion字段与match_limit类似,但不是限制调用match()的总次数,而是限制recursion的深度。 recursion深度是一个比呼叫总数less的数字,因为并不是所有对match()的调用都是recursion的。 该限制只有在设置小于match_limit时才有用。
由于PCRE库内置的默认值是10000000,我的猜测是build议为mod_security设置较低的值,以防止请求被长时间阻塞。