修改PHP脚本使WordPress拦截垃圾评论的方法示例


Posted in PHP onDecember 10, 2015

拦截英文垃圾评论

由于绝大多数的垃圾评论都是英文的,所以国内不少朋友在使用 Some Chinese Please 插件,它可以有效地拦截内容中不带有中文字的comment和trackback(pingback),不写入数据库中,可有效地减小spam对blog服务器的无谓使用。虽然已经 2 年多没有更新,但还是可用的。

其实还可以简化下,直接将下面的代码添加到主题的 functions.php 文件,效果与使用 Some Chinese Please 插件相同:

/* refused spam */ 
function refused_spam_comments( $comment_data ) { 
$pattern = '/[一-?]/u'; 
if(!preg_match($pattern,$comment_data['comment_content'])) { 
err('评论必须含中文!'); 
} 
return( $comment_data ); 
} 
add_filter('preprocess_comment','refused_spam_comments');

@Teddysun http://teddysun.com/ 经过实测反馈,Wordpress中并没有err这个函数(这个函数也许是存在于 @知更鸟 的主题里)。因此不会有提示信息出现。最好还是用wp_die函数,这样就会有提示信息。所以,上面的代码如果不生效,可以使用以下代码:

/* refused spam */ 
function refused_spam_comments( $comment_data ) { 
$pattern = '/[一-?]/u'; 
if(!preg_match($pattern,$comment_data['comment_content'])) { 
wp_die('评论必须含中文!'); 
} 
return( $comment_data ); 
} 
add_filter('preprocess_comment','refused_spam_comments');

针对那些使用技术手段,比如GET、POST等方式不填写前台表单,直接读取后台程序文件的spam,只有屏蔽IP才能缓解疯狗一样的攻势,其它什么验证码、滑动解锁等等都没用。

禁止某些IP访问

可以在.htaccess文件中添加:

Order Deny,Allow 
Deny from xxx.xxx.xxx.xx 
Deny from xxx.xxx.xxx.xx

拦截中文垃圾评论

如果发现大量垃圾评论是中文,那么可以用Willin Kan 写的小墙工具, 理论上可以 100% 屏蔽机器人发出的 spam. 如果是自然人提交评论, 小墙会在评论提交表单中加一个 hidden 变量, 如果后台检测不到这个变量, 则认定为 spam, 可以选择需要审核, 也可以直接过滤掉.

如果对方知道你用的 hidden 变量或者使用虚拟点击, 就可以破掉小墙. 但是 spam 本来就是小成本和以量取胜的事情, 除非与你与 spammer 结仇了, 我相信人家不会那么无聊来破你小墙. 而且机器人 spam 的数量占了绝大多数, 这个工具很有必要.

貌似 Willin 现在不用 WordPress 了, 网站也正在维护, 小墙代码我就贴在下面. 使用方法很简单, 拷贝到 function.php 文件最后即可. 其中 wall 是隐藏关键字, 有需要的请自行更改 (不改也可以).

class anti_spam {
 //建立
 function anti_spam() {
 if ( !current_user_can('level_0') ) {
  add_action('template_redirect', array($this, 'w_tb'), 1);
  add_action('init', array($this, 'gate'), 1);
  add_action('preprocess_comment', array($this, 'sink'), 1);
 }
 }
 
 //??谖
 function w_tb() {
 if ( is_singular() ) {
  ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#",
  "textarea$1name=$2wall$3$4/textarea><textarea name=\"comment\" cols=\"50\" rows=\"4\" style=\"display:none\"></textarea>",$input);') );
 }
 }
 
 //?z查
 function gate() {
 ( !empty($_POST['wall']) && empty($_POST['comment']) ) ? $_POST['comment'] = $_POST['wall'] : $_POST['spam_confirmed'] = 1;
 }
 
 //?理
 function sink( $comment ) {
 if ( !empty($_POST['spam_confirmed']) ) {
  //方法一:直接?醯? ? die(); 前面?尚本??h除即可.
  //die();
  //方法二:?擞???pam, 留在?料??z查是否?判.
  //add_filter('pre_comment_approved', create_function('', 'return "spam";'));
  /*
  $is_ping = in_array( $comment['comment_type'], array('pingback', 'trackback') );
  $comment['comment_content'] = ( $is_ping ) ?
  "◎ ?是 Pingback/Trackback, 小???岩蛇@可能是 Spam!\n" . $comment['comment_content'] :
  "[ 小??判?噙@是Spam! ]\n" . $comment['comment_content'];
  */
  // MG12 的?理方法
  $is_ping = in_array( $comment['comment_type'], array('pingback', 'trackback') );
  if(!$is_ping) {
  die();
  }
 }
 return $comment;
 }
}
new anti_spam();

计算前端处理时间

在输入框上方用 JavaScript 取一个时间戳作为全局变量, 在提交表单的时候获取提交时间, 两个时间相减, 如果小于可能值, 则视为机器人. 判断为机器人的评论你可以按小墙的方式处理, 也可以不处理 (不占用服务器资源, 但不能记录 spam 信息).

相对与小墙, 这种方法更加可靠, 但绝不是没有漏洞, 只要 spammer 做个 setTimeout 延迟发布就破了.

时间戳

老掉牙的方机器人方法, 很实用, 但有最大的缺点: 用户体验不好. 要求访客多填一个很难观察的数字, 严重打压评论者积极性. WordPress 平台有很多这类插件可以用, 但我是不建议使用的.

PHP 相关文章推荐
PHP实现网上点歌(二)
Oct 09 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
解析php类的注册与自动加载
Jul 05 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 PHP
PHP常用字符串函数用法实例总结
Jun 04 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
php获取图片信息的方法详解
Dec 10 #PHP
在WordPress中使用wp-cron插件来设置定时任务
Dec 10 #PHP
php数组函数array_key_exists()小结
Dec 10 #PHP
php封装的连接Mysql类及用法分析
Dec 10 #PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 #PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 #PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 #PHP
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python实现图片转字符画的示例
2017/08/22 Python
Python tkinter事件高级用法实例
2018/01/31 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
村干部承诺书
2014/03/28 职场文书
保密协议书范本
2014/04/22 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书