Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache mod_安全脚本阻止导致多个404的IP_Apache_Http Status Code 404_Blocking_Mod Security_Mod Security2 - Fatal编程技术网

Apache mod_安全脚本阻止导致多个404的IP

Apache mod_安全脚本阻止导致多个404的IP,apache,http-status-code-404,blocking,mod-security,mod-security2,Apache,Http Status Code 404,Blocking,Mod Security,Mod Security2,我想在我的网站上禁止导致多个404错误的IP地址。我在谷歌上搜索了很多,找到了一些脚本,给了我一些开始的想法。我把它们结合起来。这是我的剧本: # Determining temp data dir SecDataDir "C:\logs\datastore" # # Loading previous data for the IP request SecAction "phase:1,initcol:ip=%{REMOTE_ADDR},id:'1006'" # # Incrementi

我想在我的网站上禁止导致多个404错误的IP地址。我在谷歌上搜索了很多,找到了一些脚本,给了我一些开始的想法。我把它们结合起来。这是我的剧本:

# Determining temp data dir    
SecDataDir "C:\logs\datastore"
#
# Loading previous data for the IP request
SecAction "phase:1,initcol:ip=%{REMOTE_ADDR},id:'1006'"
#
# Incrementing block_script counter if client caused status #404
SecRule RESPONSE_STATUS "@streq 404" "phase:2,pass,setvar:ip.block_script=+1,expirevar:ip.block_script=30,id:'1007'"
#
# Denying the request if the block_script counter is greater than 3
SecRule IP:BLOCK_SCRIPT "@gt 3" "phase:2,deny,status:403,id:'1008'"
由于某种原因,它不起作用。我认为有一些错误。我很抱歉,我不是编码大师,甚至不是程序员。当我有时间的时候,我只是在玩我自制的项目。我希望有人能帮助我,我的错误很容易发现和纠正

提前谢谢

“datastore”目录已创建,可访问,在那里我可以看到2个大小为0字节的文件


谢谢

您正在尝试读取第2阶段规则中的响应状态。这在第3阶段之前不会设置,因此将规则1007更改为第3阶段

不确定这是否是一个好主意,但原因有很多:

  • ModSecurity中的第一个持久性集合在任何负载下都是不稳定的,并且每次访问服务器时,您都要跟踪访问服务器的每个IP地址。这需要对该系列进行大量跟踪和访问。就我个人而言,在ModSecurity引入内存存储系统而不是基于磁盘的存储系统之前,我不建议使用它们,而是强烈建议ModSecurity仅用于不需要持久存储的相同事务规则

  • 接下来,在同一个30秒窗口中进行三次404之后的阻塞。一个配置不正确的网页,缺少一些图像,您正在阻止合法流量。此外,如果你碰巧在搜索引擎中丢失了3个页面,那么你会阻止搜索引擎爬虫(例如谷歌机器人),这可能会对你的网站造成相当大的伤害

  • 最后一点是什么?您可能没有在Web服务器上节省任何负载,因为运行此ModSecurity规则并返回403的开销可能远远超过仅返回普通的404的开销。30秒的超时似乎是任意的,很容易被规避(无论是有意还是无意),并且会导致奇怪的结果,这只会在以后引起混淆(“嘿,奇怪的bug,有些响应有效,有些返回403-似乎是随机的。我无法理解它”),随着分类的改变,分析真实的404或web流量将变得困难


我不知道你是不是想得到这个建议,而不仅仅是答案,但我想我会警告你,以防你没有考虑到这些

看起来,最终且准确的工作版本是:

SecAction "phase:1,initcol:ip=%{REMOTE_ADDR},id:'1006'"
SecRule RESPONSE_STATUS "@streq 404" "phase:3,pass,setvar:ip.block_script=+1,expirevar:ip.block_script=600,id:'1007'"
SecRule IP:BLOCK_SCRIPT "@ge 3" "phase:2,deny,status:403,id:'1008'"

您必须将ge(错误计数器)之后的ip.block\u脚本var(禁止时间)和3更改为所需值。例如3600和5相应。

这可能是由于解析404错误的限制吗?“请注意,某些响应状态代码(如404)在请求周期的早期由Apache处理,my无法按预期触发。”“SecAuditEngine ModSecurity当前能够记录大多数事务,但不是所有事务。涉及错误的事务(如400和404事务)使用ModSecurity不支持的其他执行路径。”感谢您的回复。现在,随着阶段的改变,它开始工作了!但在第一幕之前,它需要404支安打中的4支。但不是3。你知道为什么吗?我想把它修好。关于你的担忧。请别担心!这是测试值,我将使用另一个。它是为一些流量非常低、黑客活动非常频繁的特殊项目设计的。这里每天最多只有20-50名游客。最后,我将调整禁令一周,并将404计数器增加到5或更多。仅供参考:这是基于Windows的Apache,像Fail2Ban这样的解决方案将不起作用。根据下面的答案,第3阶段到底起作用了吗?