问题描述
我看到大量的流量,我怀疑是使用请求格式的
来探测漏洞或漏洞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]