最基础版本
最基础的验证码原理不复杂,给评论框加上两个隐藏参数mp-num1
和mp-num2
,给用户一个看得见的输入框mp-sum
,提交评论的时候检查mp-num1
+mp-num2
是否和mp-sum
一致,不一致就拒绝提交。
修改comments.php
,假如上述三个参数
<?php $num1 = rand(1, 49);$num2 = rand(1, 49); ?>
<span><?php _e("验证码 %s + %s =", $num1, $num2); ?></span>
<input type="text" name="mp-sum" placeholder="<?php _e("请输入计算结果") ?>" required>
<input type="hidden" name="mp-num1" value="<?php echo $num1; ?>">
<input type="hidden" name="mp-num2" value="<?php echo $num2; ?>">
当然了,光有前端是不行的。给提交评论接口加个验证码校验函数,修改functions.php
,加入下面的代码
Typecho_Plugin::factory('Widget_Feedback')->comment = ['XComment', 'feedbackFilter'];
class XComment {
/**
* 获取 Request 实例
* @return \Typecho\Widget\Request|Typecho_Request
*/
public static function getRequest()
{
if (class_exists('Typecho\Widget\Request')) {
return new Typecho\Widget\Request(Typecho\Request::getInstance());
}
return Typecho_Request::getInstance();
}
/**
* 评论发布钩子
* @param $comment
* @param $archive
* @return mixed
* @throws \Typecho\Widget\Exception
*/
public static function feedbackFilter($comment, $archive)
{
$request = self::getRequest();
/** 评论必须回答问题 */
$sum = $request->filter('intval')->get('mp-sum');
$num1 = $request->filter('intval')->get('mp-num1');
$num2 = $request->filter('intval')->get('mp-num2');
if ($sum !== ($num1 + $num2)) {
throw new \Typecho\Widget\Exception(_t('对不起: 验证码错误,请<a href="javascript:history.back(-1)">返回</a>重试。', '评论失败'));
}
}
}
这样就可以防住一部分特别低级的机器人了。
验证码输出为图片
因为这套代码流传挺广的,容易被脚本小子一锅端,可以考虑把验证码输出为图片。原理也不复杂,调用PHP的GD库把文本转成图片就行。
此处内容已隐藏,回复后(需要填写邮箱)可见
加密校验参数
上面只是把验证码提示换成了图片,但是校验参数还是明文的,不太好,加密校验参数很简单,就是不往用户那边发数字,去掉mp-num1
和np-num2
,那你会问我那怎么对应答案呢?计算机行业的大佬(具体是谁 CHATGPT3.5也不知道)给你想好了,使用session存放这个验证码,session是由服务器端维护的用户会话数据。用人话说就是档案袋,你有,但是你不能摸。
$_SESSION['mp-sum'] = $num1 + $num2;
验证
class XComment {
...
public static function feedbackFilter($comment, $archive)
{
$request = self::getRequest();
/** 评论必须回答问题 */
$sum = $request->filter('intval')->get('mp-sum');
if ($sum !== $_SESSION['mp-sum']) {
throw new \Typecho\Widget\Exception(_t('对不起: 验证码错误,请<a href="javascript:history.back(-1)">返回</a>重试。', '评论失败'));
}
}
}
预览
暂时没有,因为本站新主题还在构思中,老主题不想动了
看看效果如何,可以就拿下了
瞅瞅
asdasd擦
看看代码
来瞅瞅~~~~~
试试看来着
看看效果怎么样
你自己也没用验证码啊
https://blog.iplayloli.com 老主题才有
测试