我是一只历经沧桑的老狮

阻止垃圾评论:为博客添加算术验证码

起因

最近老是被一些垃圾评论弄得火冒三丈,虽说已经设置了评论必须经过审核之后才会显示,但每次进入后台有成堆的垃圾评论,看着就心烦,于是就想用什么方法杜绝这些可恶的垃圾评论。首先想到的是禁止 IP 访问,在网上搜索一番后没有理想的解决方法,于是退而求其次利用验证码来抵挡垃圾!找了好多,有插件的,有直接代码的,有图片验证有滑动验证...... 五花八门的都有,最后选择的是——算术验证。至于选择算术验证的原因是:提高小学生的算术能力,哈哈!好啦废话不多说,老规矩,好东西就是要分享,我从不生产代码,我只是代码的搬运工

食用方法

打开 functions.php 文件,在文件最后面添加下面的代码:

    // 算术验证评论
    function themeInit($comment){$comment = spam_protection_pre($comment);
    }
    function spam_protection_math(){$num1=rand(1,50);
    $num2=rand(1,50);
    echo "<label for=\"math\" style=\"margin-top: 18px;float:left;width=350px;
\"> 请输入 <code>$num1</code>+<code>$num2</code> 的计算结果:</label>\n";
    echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" style=\"height: 26px;width:50px;margin-top: 18px;margin-right: 14px;
\" placeholder=\"?\">\n";
    echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">\n";
    echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}
function spam_protection_pre($comment, $post, $result){$sum=$_POST['sum'];
    switch($sum){case $_POST['num1']+$_POST['num2']:
        break;
        case null:
        throw new Typecho_Widget_Exception(_t('对不起: 请输入验证码。<a href="javascript:history.back(-1)"> 返回上一页 </a>','评论失败'));
        break;
        default:
        throw new Typecho_Widget_Exception(_t('对不起: 验证码错误,请 <a href="javascript:history.back(-1)"> 返回 </a> 重试。','评论失败'));
    }
    return $comment;
}

保存好 functions.php 文件之后,再打开 comments.php 文件(如果主题自带评论文件的话就在 comments.php 添加),在

<button type="submit" class="submit" id="misubmit"> 发布 </button>

前面添加以下代码(当然也可以在自己喜欢的任意地方添加都可以)

<?php spam_protection_math();?> 

修改样式

<label style=\"line-height:30px;\" for=\"math\"><code>$num1</code>+<code>$num2</code> = 
</label>\n";
echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" 
style=\"width:130px;float:right;\" placeholder=\" 计算结果:\">\n";

可以通过修改以上代码来简单的修改样式,其中 line-height:30px 是上下间距,size=\"25\"是字体大小,width:130px是边框的宽度,float:right;是边框的位置,可以设置为 right(右)、left(左)、none(默认)等。

补充说明

之后我将 PHP 版本从 5.6 换成了 7.2 导致算术代码失效,所以又换了另一种代码。如下

/* 评论 算术验证码 */
function themeInit($comment){if ($comment->is('single')) {$comment = spam_protection_pre($comment);
    }
}
function spam_protection_math(){$num1=rand(0,9);
    $num2=rand(0,9);
    echo "<label  style=\"line-height:30px;\" for=\"math\"><code>$num1</code>+<code>$num2</code></label>\n";
    echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" style=\"width:60px;float:left;\" placeholder=\" 计算结果:\">\n";
    echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">\n";
    echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}
function spam_protection_pre($commentdata){$sum=$_POST['sum'];
    switch($sum){case $_POST['num1']+$_POST['num2']:
            break;
        case null:
            throw new Typecho_Widget_Exception(_t('有一道数学题还在等着你,往哪跑?<a href="javascript:history.back(-1)"> 回去算题 </a>✍','评论失败'));
            break;
        default:
            throw new Typecho_Widget_Exception(_t('再给你一次按计算器的机会!<a href="javascript:history.back(-1)"> 重新计算 </a>','评论失败'));
    }
    return $commentdata;
}

原文出处

以上代码部分原文出自于:JDEAL

本站未注明转载的文章均为原创,转载请注明来源,谢谢!

添加新评论