如果查询字符串包含关键字,则htaccess发送404

问题描述

我看到大量的流量,我怀疑是使用请求格式的

来探测漏洞或漏洞
https://example.com/?testword

我认为,在深入研究的同时,我可以节省资源,并通过404或500响应来中断或阻止这些请求

我尝试过

RewriteEngine On
RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]

与Query字符串上的其他一些变体匹配,但在测试时似乎没有一个返回404。我发现的其他问题是查找查询字符串值/对并重写它们,但似乎没有任何示例仅针对单个值退出

解决方法

RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]

这里有几个问题:

  • 您条件中的 CondPattern 被否定(前缀{!),因此只有在testword不存在时才成功在查询字符串中。

  • RewriteRule指令缺少 pattern (第一个)参数(或 substitution (第二个)参数,具体取决于您的外观) 。 RewriteRule伪指令仅与URL路径匹配。

  • 当您为R标志指定非3xx状态代码时,替换被忽略。您应该指定一个连字符(-)来表示无替代

要测试整个单词“ testword”在查询字符串中的任何地方,可以使用正则表达式\btestword\b-其中\b单词边界。或者,也许您只是希望正则表达式testword-可以在任何地方(包括当它出现在另一个单词中时)匹配“ testword”?相比之下,正则表达式(^|&)testword($|&)会丢失其中“ testword”作为URL参数名称出现的实例。

请尝试以下操作:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^$ - [R=404]

这仅与首页匹配(即,空的URL路径)。指定非3xx返回状态时,L标志不是必需的。

-(第二个参数)表示无替代。如上所述,当指定非3xx HTTP状态时,替换字符串仍然会被忽略。

要测试任何 URL路径,然后只需删除$ 模式上的RewriteRule(字符串结尾锚)即可。例如:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^ - [R=404]

如果您的首页不接受任何查询字符串参数,那么当存在查询字符串时,您可以简单地拒绝该请求(即404未找到)。例如:

RewriteCond %{QUERY_STRING} .
RewriteRule ^$ - [R=404]