Willin Kan大师提供的WP Anti Spam 小墙代码
小牆 1.81 是 小牆 1.8 的修改版, 不是升级版.
在原功能不变的基础下, 改动两个地方:
一、取消了 Trackbacks/Pingbacks 的拦劫.
二、将 spam 的基本资料存进档头.
ps. 2010/12/16 最新修改, 是 1.82 版.
将下列代码 copy 到模板的 functions.php
- /* <<小牆>> Anti-Spam v1.82 by Willin Kan. 2010/12/16 最新修改 */
- //建立
- 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=$2w$3$4/textarea><textarea name=\"comment\" cols=\"100%\" rows=\"4\" style=\"display:none\"></textarea>",$input);') );
- }
- }
- //檢查
- function gate() {
- if ( !emptyempty($_POST['w']) && emptyempty($_POST['comment']) ) {
- $_POST['comment'] = $_POST['w'];
- } else {
- $request = $_SERVER['REQUEST_URI'];
- $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '隱瞞';
- $IP = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] . ' (透過代理)' : $_SERVER["REMOTE_ADDR"];
- $way = isset($_POST['w']) ? '手動操作' : '未經評論表格';
- $spamcom = isset($_POST['comment']) ? $_POST['comment'] : null;
- $_POST['spam_confirmed'] = "請求: ". $request. "\n來路: ". $referer. "\nIP: ". $IP. "\n方式: ". $way. "\n內容: ". $spamcom. "\n -- 記錄成功 --";
- }
- }
- //處理
- function sink( $comment ) {
- if ( !emptyempty($_POST['spam_confirmed']) ) {
- if ( in_array( $comment['comment_type'], array('pingback', 'trackback') ) ) return $comment; //不管 Trackbacks/Pingbacks
- //方法一: 直接擋掉, 將 die(); 前面兩斜線刪除即可.
- //die();
- //方法二: 標記為 spam, 留在資料庫檢查是否誤判.
- add_filter('pre_comment_approved', create_function('', 'return "spam";'));
- $comment['comment_content'] = "[ 小牆判斷這是Spam! ]\n". $_POST['spam_confirmed'];
- }
- return $comment;
- }
- }
- $anti_spam = new anti_spam();
- // -- END ----------------------------------------
小牆 1.81 的速度是没什麽差别.
因为有人提议 Trackbacks/Pingbacks 不需拦劫, 1.81 就是为此而修改, 用了 1.81 可要自己当心了. 还好, 现在的 Trackbacks/Pingbacks 的 spam 没有以前那麽猖獗, 这大可放心.
最大重点是加入了 spam 的基本资料, 包含请求( REQUEST_URI )、来路( HTTP_REFERER )、IP、操作方式, 可提供下一步加强防护的参考.
例:
如果你用的是我的 WordPress 内置嵌套评论专用 Ajax comments, 那麽 '请求' 应该是你主题路径的那个 comments-ajax.php, 而不应该是根目录的那个 wp-comments-post.php, 你可大胆把 wp-comments-post.php 文件更名, 让他没门进来. 但用了这方法, 垃圾评论一条也没有, 短时间还真会让你有些不习惯.
'来路' 通常可以经过伪造, 较不可信, 仅供参考.
虽然 WordPress 在后台可看到 spam 的 IP, 倘若通过代理就不一样了, 小牆所记录的是代理之前的 IP, 除非他用高匿名代理, 那就真的无法得知了.