修改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中session_unset与session_destroy的区别分析
Jun 16 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
php解析url的三个示例
Jan 20 PHP
php实现paypal 授权登录
May 28 PHP
帝国cms常用标签汇总
Jul 06 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PHP实现本地图片转base64格式并上传
May 29 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的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
学习ExtJS Column布局
2009/10/08 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
js实现计算器功能
2020/08/10 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
python中常用的九种预处理方法分享
2016/09/11 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
分享一个python的aes加密代码
2020/12/22 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
个人求职信范文分享
2014/01/06 职场文书
中学教师教育感言
2014/02/21 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
领导干部失职检讨书
2015/05/05 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
母亲节主题班会
2015/08/14 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
求职自我评价参考范文
2019/05/16 职场文书
导游词之河北野三坡
2019/12/11 职场文书