- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我让 Apache 和 Modsecurity 一起工作。我试图通过请求的 header (如“facebookexternalhit”)来限制命中率。然后返回友好的“429 Too Many Requests”和“Retry-After: 3”。
我知道我可以读取一个标题文件,例如:
SecRule REQUEST_HEADERS:用户代理“@pmFromFileratelimit-bots.txt”
但是我在构建规则时遇到了麻烦。
任何帮助将不胜感激。谢谢。
最佳答案
经过两天的研究和理解 Modsecurity 的工作原理,我终于做到了。仅供引用,我正在使用 Apache 2.4.37 和 Modsecurity 2.9.2 这就是我所做的:
在我的自定义文件规则:/etc/modsecurity/modsecurity_custom.conf
中,我添加了以下规则:
# Limit client hits by user agent
SecRule REQUEST_HEADERS:User-Agent "@pm facebookexternalhit" \
"id:400009,phase:2,nolog,pass,setvar:global.ratelimit_facebookexternalhit=+1,expirevar:global.ratelimit_facebookexternalhit=3"
SecRule GLOBAL:RATELIMIT_FACEBOOKEXTERNALHIT "@gt 1" \
"chain,id:4000010,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,log,msg:'RATELIMITED BOT'"
SecRule REQUEST_HEADERS:User-Agent "@pm facebookexternalhit"
Header always set Retry-After "3" env=RATELIMITED
ErrorDocument 429 "Too Many Requests"
说明:
注意:我希望每 3 秒限制 1 个请求。
您可以通过添加 @pmf 和 .data 文件来改进此规则,然后初始化全局集合,例如 initcol:global=%{MATCHED_VAR}
,这样您就不会仅限于单个匹配规则。我没有测试最后一步(这是我现在需要的)。如果有的话,我会更新我的答案。
更新:
我已经调整了规则,以便能够拥有一个包含我想要限制速率的所有用户代理的文件,因此单个规则可以在多个机器人/爬虫之间使用:
# Limit client hits by user agent
SecRule REQUEST_HEADERS:User-Agent "@pmf data/ratelimit-clients.data" \
"id:100008,phase:2,nolog,pass,setuid:%{tx.ua_hash},setvar:user.ratelimit_client=+1,expirevar:user.ratelimit_client=3"
SecRule USER:RATELIMIT_CLIENT "@gt 1" \
"chain,id:1000009,phase:2,deny,status:429,setenv:RATELIMITED,log,msg:'RATELIMITED BOT'"
SecRule REQUEST_HEADERS:User-Agent "@pmf data/ratelimit-clients.data"
Header always set Retry-After "3" env=RATELIMITED
ErrorDocument 429 "Too Many Requests"
因此,带有用户代理的文件(每行一个)位于此规则同一目录下的子目录中:/etc/modsecurity/data/ratelimit-clients.data
。然后我们使用 @pmf 读取并解析文件( https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)#pmfromfile )。我们使用用户代理初始化 USER 集合:setuid:%{tx.ua_hash}
(tx.ua_hash 位于 /usr/share/中的全局范围内) modsecurity-crs/modsecurity_crs_10_setup.conf
)。我们只是使用user作为集合,而不是global。仅此而已!
关于apache - Modsecurity & Apache : How to limit access rate by header?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53620557/
我是一名优秀的程序员,十分优秀!