修改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入门速成(2)
Oct 09 PHP
php 购物车的例子
May 04 PHP
php基础学习之变量的使用
Jun 09 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
php顺序查找和二分查找示例
Mar 27 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 PHP
discuz目录文件资料汇总
Dec 30 PHP
PHP中的类型约束介绍
May 11 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 PHP
laravel5 Eloquent 实现事务方式
Oct 21 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
Python3.4解释器用法简单示例
2019/03/22 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
给排水工程师岗位职责
2013/11/21 职场文书
教育学专业实习生的自我鉴定
2013/11/26 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
护士的自我鉴定
2014/02/07 职场文书
家长会感言
2015/08/01 职场文书
村官2015年度工作总结
2015/10/14 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书