简单修改emlog的checkcode.php给验证码增加干扰线和噪点

2016-3-28 / 1 评论 emlog / Mrxn

本文共计 2728 字,感谢您的耐心浏览与评论.

以下是在论坛看到ewceo的帖子里的,但是他并没有给出具体的代码,对于菜鸟们来说就不容易;

修改过程图览:00.png01.png023.png

鉴于 @奇遇 的反垃圾评论插件(哪怕是最新3.5版)经常被非法侵入式清空设置并报错,也不知是啥BUG,只好亲自动手来反击显示为国外IP的长篇英文评论了


首先分析状况:咱EMLOG的所有文章评论表单都是使用一个相同的提交地址,只是将文章ID赋在一个INPUT之中,这就给了机器人可趁之机:提交地址固定的、验证码地址固定的(还TM特好识别),文章ID是数字的随机生成就好,EMLOG的评论表单被模似简直是史上最轻松啊!所以JS之类的手段在机器人面前都是渣……

8错,在尚无给力插件问世的情况下,治标治本的办法只有改内核文件了:

第1步:英文垃圾评论一大特色就是长篇的并夹杂着火星文字,所以必含中文这样的反制也弱爆了,comment_controller.php文件定义评论最大字符数居然为8000,这是干神马的节奏,很多文章都够不到4000字好吧,发条微博和说说都不能超140字,所以偶赶紧给改为几百压压惊,上千字的精彩评论偶不需要啊

完成第一步还得紧接着做第2步:额,斗个胆,EMLOG默认的验证码偶能吐个槽么,生成的文字中规中矩且颜色清晰好辨,根本就是鸡肋嘛,除了给真心评论的人制造一道坎外,简直就是垃圾评论机器人的帮凶,还有比这更好自动识别的验证码么?checkcode.php唯一可赞之处似乎是不涉及字体文件,代码也比较精炼,这是偶所喜欢的风格,因此就没给彻底换掉,只是加了一点代码:增加几个随机线条,文字颜色范围也弄宽了点(为了防止人眼难识别,增加了点击刷新)……

如此2招之后偶就已经开始坐等机器人了,别的没啥,偶就是在线时间多,突然发现与垃圾评论玩玩策略对抗也有点意思,话说机器人若玩不过偶就暂不上后招咯



学过php的人应该很容易修改,我在这里把我修改过的粗略代码贴出来,便于不会的朋友借鉴,也便于会的朋友给我指点:

<?php
/**
 * Emlog图片验证码生成程序
 * @copyright (c) Emlog All Rights Reserved
 * Modify By Mrxn 
 * Emlog  Site: http://www.emlog.net/
 * Mrxn's Blog: https://mrxn.net/
 */

session_start();

$randCode = '';
$chars = 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPRSTUVWXYZ23456789';
for ( $i = 0; $i < 5; $i++ ){
	$randCode .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}

$_SESSION['code'] = strtoupper($randCode);

$img = imagecreate(75,25) or die("创建图像资源失败,请刷新页面");
$bgColor = isset($_GET['mode']) && $_GET['mode'] == 't' ? imagecolorallocate($img,245,245,245) : imagecolorallocate($img,255,255,255);
$pixColor = imagecolorallocate($img,mt_rand(88, 245), mt_rand(55, 240), mt_rand(99, 200));
//画字符、大小
for($i = 0; $i < 5; $i++){
	$x = $i * 13 + mt_rand(3, 7) - 2;
	$y = mt_rand(0, 3);
	$text_color = imagecolorallocate($img, mt_rand(100, 250), mt_rand(80, 180), mt_rand(90, 220));
	imagechar($img, 5, $x + 5, $y + 3, $randCode[$i], $text_color);
}
//画干扰点
for($j = 0; $j < 240; $j++){
	$x = mt_rand(0,100);
	$y = mt_rand(0,40);
	imagesetpixel($img,$x,$y,$pixColor);
}
//4条横斜线
for ($i=0; $i < 5; $i++) { 
    $lineColor = imagecolorallocate($img, rand(50, 150), rand(50, 150), rand(50, 150));
    $lineX1 = 0;
    $lineX2 = 80;
    $lineY1 = ($i + 1) * 8;
    $lineY2 = ($i + 1) * 15;
    imageline($img, $lineX1, $lineY1, $lineX2, $lineY2, $lineColor);
}

//4条竖斜线
for ($i=0; $i < 5; $i++) { 
    $lineColor = imagecolorallocate($img, rand(50, 150), rand(50, 150), rand(50, 150));
    $lineY1 = 0;
    $lineY2 = 30;
    $lineX1 = ($i + 1) * 8;
    $lineX2 = ($i + 1) * 15;
    imageline($img, $lineX1, $lineY1, $lineX2, $lineY2, $lineColor);
}

header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
将以上代码保存为[code]checkcode.php[/code]放在 你网站根目录/include/lib/下 覆盖,然后重启Apache或者是Nginx 即可看到效果(当然需要后台开启验证码)
为防止真正的读者不能识别验证码,请给验证码添加上 点击刷新 功能,
参考链接:给emlog5.3添加验证码刷新功能 https://mrxn.net/emlog-teach/242.html
[red]注:在进行DIY操作之前,请先备份相关文件,以防万一!本文基于emlog 5.31测试可行,理论上兼容所有版本,只要php版本不低于4[/red]
相关参考:
https://segmentfault.com/a/1190000002924386
http://bbs.emlog.net/thread-40567-1-1.html

对于反垃圾评论,也可以试试我这款插件:

https://mrxn.net/emlog-teach/emlog-math-comment-plugin.html

http://www.emlog.net/plugin/248


标签: 代码 php emlog 验证码

转载:转载请注明原文链接 - 简单修改emlog的checkcode.php给验证码增加干扰线和噪点


1条回应:“简单修改emlog的checkcode.php给验证码增加干扰线和噪点”

  1. arham

    这篇文章成为年轻一代动机的源泉。


发表评论

{view_code_no}