如何防止 WordPress 垃圾评论使您的 WordPress 博客崩溃并关闭您的服务器
已发表: 2021-08-19首先,我只是想澄清一下,这篇文章不是关于如何检测和标记垃圾评论的。 WordPress 插件 Akismet 在筛选和过滤传统的 WordPress 垃圾评论方面已经做得很好。
相反,这篇文章是关于如何防止垃圾评论和其他流氓活动使您的服务器崩溃并关闭您的博客。

照片由 BoxChain
正如我在上一篇文章中提到的,我博客的访问量在过去一年中翻了一番。
不幸的是,在那段时间里,垃圾评论的数量也增加了一个数量级。
只是给你一个想法,在 12 月的几天里,我每隔几秒钟就会收到 20 多条垃圾评论。
是的,你没听错。 每当我刷新仪表板时,我都会在 Akismet 过滤器中看到 20 条或更多垃圾评论。 事实上,垃圾邮件的数量使我服务器上的所有网站在那些日子里很长一段时间都非常慢或无法访问。
WordPress 的问题
现在在正常运行下,我的博客在流量很大的情况下表现很好,因为有一个名为 WP Super Cache 的插件。
本质上,这个插件为我博客中的每篇文章创建了一个静态版本,以便它可以非常快速地提供给最终用户。
然而,这个插件对于大量涌入的评论却束手无策,因为评论需要你的服务器每次都调用 WordPress 才能一一处理评论。
并且因为 WordPress 是一个资源猪,即使您在专用服务器上并使用缓存插件,大量垃圾评论也可以轻松关闭任何博客。
如果您使用世界上最好的垃圾评论过滤器并不重要,所有垃圾评论仍然必须由 WordPress 处理,这会占用大量服务器资源。
垃圾邮件机器人的特征
现在有一个缓慢或无法访问的博客是一回事,但垃圾评论也会影响在同一台服务器上运行的其他网站,这是不可接受的。 在对垃圾邮件机器人进行了一些研究之后,我发现了一些事情。
- 垃圾邮件机器人通常不接受 cookie
- 垃圾邮件机器人可以在几秒钟内留下垃圾评论
- 垃圾邮件机器人通常不运行 javascript
那么这是什么意思? 用非技术术语来说,垃圾邮件机器人的行为不像网络浏览器上的普通用户。 解决我的问题的关键是立即检测垃圾邮件机器人并将其定向到错误页面,而不是启动 WordPress。
基于上述特征,我可以通过在用户的机器上放置 cookie、在页面加载后禁用评论数秒或提出一些 javascript 代码来检测垃圾邮件机器人来检测垃圾邮件机器人。
解决我的垃圾评论问题
经过深思熟虑,我想出了一个修复方法,每当访问我博客上的页面时,都会在用户的机器上秘密插入一个 cookie。 然后我可以在允许评论通过之前在用户的机器上查找这个 cookie。
因为垃圾邮件机器人通常不接受 cookie,所以我可以轻松检测机器人并将其定向到静态错误页面。
最初,我打算将我的源代码发布在我用 javascript 编写的这篇博客条目上(如果您好奇,我很乐意将其发送给您),但在与一些博主交谈后,我发现同一作者WP Super Cache 的 Donncha 已经编写了一个名为 Cookies For Comments 的插件,它基本上与我刚刚编写的内容相同。
因为他的插件比我的 javascript 插件写得更优雅,我强烈建议你去下载它。
但是,如果您打算使用 Donncha 的 Cookies For Comments 插件,请确保对您的 .htaccess 进行以下更改,这与插件的安装说明不同。
RewriteCond %{HTTP_COOKIE} !^.*2071a9e39879b6a958b06162384d3c06.*$
RewriteRule ^wp-comments-post.php – [F,L]
这两行有什么作用? 基本上,这些代码行检测插入到用户机器上的秘密 cookie 的存在。 如果 cookie 不存在,则用户或垃圾邮件机器人将被定向到 WordPress 的 404 页面或“找不到页面”。

现在这个默认设置的问题是 WordPress 仍然被调用以处理仍然需要大量服务器资源的 404 页面。
RewriteCond %{HTTP_COOKIE} !^.*2071a9e39879b6a958b06162384d3c06.*$
RewriteRule ^wp-comments-post.php error.html [L]
这里的区别在于垃圾邮件机器人被定向到一个完全静态的错误页面,这会阻止 WordPress 完全加载。
问题解决了??? 不完全
所以我上面描述的更改解决了我的垃圾评论问题,但是在顺利运行几天后,我的服务器又开始崩溃了! 查看我的服务器日志,我发现了以下内容。
mywifequitherjob.com GET /oxvumirserver33.rar
mywifequitherjob.com GET /oxvumirserver33.rar
mywifequitherjob.com GET /oxvumirserver33.rar
基本上,一些流氓机器不断尝试访问我服务器上的同一个不存在的文件,这导致站点崩溃。 现在对于普通网站,这些流氓访问根本不会影响服务器。
但是,WordPress 会处理对不存在文件的所有访问,并将用户发送到 WordPress 的自定义 404 或“找不到页面”网页。
我有没有提到 WordPress 是一个资源猪? 所需要的只是一堆这些虚假访问,无论您使用什么缓存插件,您的服务器仍然会宕机。
解决这个问题的秘诀类似于我的垃圾评论问题。 理想情况下,我们希望将 WordPress 完全排除在外,并将流氓用户发送到完全静态的错误页面,以节省服务器资源。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|
asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg
|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|
odp|ods|odt|ogg|pdf|png|pot|pps|pt|pptx|ra|ram|rar|swf|tar|tif|tiff|wav|wma
|wri|xla|xls|xlsx|xlt|xlw|zip)$ [NC]
重写规则 .* – [L]
错误文档 404 https://mywifequitherjob.com/404.html
所有这些代码有什么作用? 基本上,当从我的服务器请求与上述类型之一匹配的文件时,我希望我的服务器完全绕过 WordPress。 如果该文件不存在,用户将被定向到名为 404.html 的静态错误页面。
再一次,绕过 WordPress 是解决我的崩溃问题的关键。 因为我的服务器日志中的流氓进程正在访问一个 .rar 文件,我现在将这个恶意用户重定向到我的错误页面,该页面几乎不占用任何资源。
这能解决我所有的问题吗?
因此,我已经使用上述 2 个更改运行了几个星期,并且我的服务器一直像冠军一样运行,没有减速。 不幸的是,WordPress 的编写方式无法防止所有恶意访问使您的服务器崩溃。
例如,每当有人尝试访问在我的博客上找不到的文章时,WordPress 仍然会加载。 所以理论上,如果有人想关闭 MyWifeQuitHerJob.com 或任何 WordPress 博客,他们要做的就是一遍又一遍地访问网站上不存在的页面。
但与此同时,我的一切似乎都很稳定。 希望将来可以修补 WordPress 以解决这些服务器问题。