htaccess 规则用于防止对 WordPress index.php?pubkey= 的恶意帖子请求

htaccess 规则用于防止对 WordPress index.php?pubkey= 的恶意帖子请求

我一直在查看一个名为 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>包装器。

相关内容