WordPress垃圾评论治理经验分享

WordPress这玩意最令人诟病的一个问题应该就是垃圾评论了,玩Wordpress的朋友应该都有体会。所以针对垃圾评论的防护方案也有不少,比如官方主推的插件Akismet。我之前也是一直在用这个插件,直到有一天,发现待审核评论里边躺着十几万条,Akismet告诉我超过了免费版的额度。

无奈当时为了快速处理掉,就付费订阅了,36刀一年,一用就是三四年,后来才发现,原来费用也可以调低到3刀一年,当了好几年大冤种。当然付费之后的防护效果还是不错的,绝大部分垃圾评论直接进了垃圾箱。不过进到垃圾箱的评论依然是要写数据库的,像我这种5刀一个月的VPS,在面对自动化饱和式倒垃圾的时候,还是有可能会被干挂的(不知道这种攻击到服务器挂掉的目的是啥)。

最近有了些空闲时间,重新思考了一下这个问题。
● 我只需要保留真人的留言
● 机器人自动评论没有必要在垃圾箱保存

基于以上需求,可以在插件市场找到一些验证码方案的插件,或者reCAPTCHA 这种方案的插件,都是在留言的过程中增加操作来做验证,判断留言者是不是一个真实的人。不过对于我这种几乎没有啥量的小站来说,似乎是有点过重了,还严重拉低了用户体验。

所以我开始琢磨自己在代码上动动手脚,让机器人找不到真正发表评论的入口。

我发现Wordpress 本身在评论这块只使用了最基础的HTML表单,对于机器人来说,只要读到表单,按照表单的action地址发送表单数据就可以了,这个门槛着实有点太低了。

于是我开始动手改造这部分的代码:
● 首先在原来“提交评论”按钮(按钮A)后边再放一个按钮(按钮B),作为真正提交评论的按钮,用css将原来的按钮A隐藏;
● 然后用一段js代码监听按钮B的点击状态,来发送POST请求;
● 最后将原来的接收表单的API改成直接返回成功,按钮B发送的数据到一个新的API正常评论。

如此修改后运行了几天,目前还没有一个垃圾评论进入数据库。至少比之前一天至少几百条的情况好太多了,终于可以把Akismet的钱省下来了。

对于我这种流量极低的站点来说,这个方案应该是比较稳的了,除非针对我专门制作攻击方案,我觉得目前我还不配,如果攻击我立马投降就是。

最后,分享一下做这种修改需要接触到哪些代码:
wp-comments-post.php 接收评论表单的API
wp-includes/comment-template.php 生成评论部分的前端代码

对于有一些前端经验的同学,这些应该没啥难度,无非照猫画葫芦。
只是我发现对于jQuery的使用要注意一下,$符号似乎不能用,必须显示的使用jQuery(比如:jQuery.post)。
另外,发表评论后,php会返回字符串形式的html,自己通过js发送的POST请求需要再处理一下返回数据,否则可能会让用户感觉什么都没发生。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

RSS
Follow by Email
YouTube
YouTube
Pinterest
fb-share-icon
LinkedIn
Share
VK
Weibo
WeChat
WhatsApp
Reddit
FbMessenger
Copy link
URL has been copied successfully!