我一直在查看一个名为 Bad Behavior 的 WordPress 插件创建的日志,其中有许多来自不同 IP 地址在一天中不同时间间隔的条目正在请求以下 URL:
POST www.example.com/index.php?pubkey=b13bdb8297326599cf86aj25274e6a0c&bvTime=1549500166&bvVersion=0.1&bvMethod=getdata&sha1=true&sig=53fb643e40685ed89aa6754483b0a0d06bf1e63d0
URL 中保持不变的部分与/index.php?pubkey=
日志中其他条目的其余部分不同。
如果可能的话,我想做的是通过.htaccess
根目录阻止那些发布请求。
在研究时我在这里找到了这个答案:限制对 index.php 的访问 - Apache
但由于我不太了解如何在.htaccess
文件中正确构建指令,因此我不想在其中添加可能阻止合法流量或导致其他问题的内容。
我在搜索时也发现了这条信息https://perishablepress.com/protect-post-requests/但他们警告你,如果网站不是静态的或使用表格,那么使用以下规则可能会有问题,而这个特定的网站就是这样的。
#deny all POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteRule .* - [F,L]
</IfModule>
所以,我希望这里添加足够的信息,可以帮助别人帮助我找到这个特定问题的答案。
答案1
该解决方案确实与您链接到的问题。
但是,我想问的一个问题是,您是否需要专门针对 POST 请求?为什么不是任何以 开头的请求(GET 或 POST)/index.php?pubkey=
?或者这在 WordPress 中还有其他含义吗?
在这种情况下,您可以在文件顶部执行如下操作.htaccess
:
RewriteCond %{QUERY_STRING} ^pubkey=
RewriteRule ^index\.php$ - [F]
不需要<IfModule>
包装器。不需要重复该RewriteEngine
指令,因为毫无疑问该指令稍后会在文件中设置。
为了专门针对 POST 请求,您可以添加另一个条件,如您在示例中所做的那样:
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{QUERY_STRING} ^pubkey=
RewriteRule ^index\.php$ - [F]
更新:它没有像我预期的那样工作,因为我可以通过访问来加载页面
www.example.com/index.php?pubkey=
如果上述指令在.htaccess
文件中的位置不正确且与其他指令冲突,则可能会发生这种情况。它需要位于文件的最顶部.htaccess
,在任何现有 mod_rewrite 指令之前。
经过反复试验后,这完全阻止了我,它可以工作,但我不明白为什么,你能解释一下你给我的和这个之间的区别吗?
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} (pubkey=.*) [NC] RewriteRule (.*) - [F,L] </IfModule>
这更为通用,并且阻止的内容远不止问题中所述的 URL(可能太多了)。这些指令阻止任何包含以下内容的 URL 路径pubkey=
(不区分大小写)任何地方在查询字符串中。因此,它将阻止以下 URL(除上述 URL 外):
example.com/foo/bar?pubkey=xyz
example.com/foo/bar/baz?abc=1&xyz=2&pubkey=
example.com/foo/bar/baz?def=2&xyz=3&PuBkEy=xyz
这些指令可以简化:
RewriteCond %{QUERY_STRING} pubkey= [NC]
RewriteRule .* - [F]
无需捕获这RewriteRule
图案或者条件模式。正则表达式pubkey=
与 相同pubkey=.*
。使用 标志L
时不需要 标志F
。并且如上所述,无需重复RewriteEngine
指令或使用<IfModule>
包装器。