【分享】看看这个验证码怎么样

朱丽叶与驴斗殴 2010-12-15 06:59:31
前天看了一篇关于如何用程序去识别破解验证码的文章,才发现现在很多网站的验证码都是摆设,于是决定自己写一个,由于并没有考虑到美观因素,所以生成的验证码可能不怎么美观。
由于干扰点不仅对防破解没什么帮助,有时还影响阅读,所以不加上去。至于干扰线再研究一下那篇文章,过两天有空补上来。


考虑到为了能适应更多的情况,需要设置的参数比较多
本文权当抛砖,希望能各位能提出问题来,我只想改进,改进,一直改进

<?php
/*
* Created on 2010-12-14 下午01:35:27
* Author:hst001
* Version:1.0
*
*/

class cheakcode
{

private $alltext;

private $imgw; //图片宽度
private $imgh; //图片高度
private $fs; //字体大小(px)
private $fso; //字体大小变化量,一般在1到3个像素
private $fa; //字体旋转角度
private $lro; //左右偏移
private $udo; //上下偏移
private $ffldx; //第一个字符左下角的x坐标
private $ffldy; //第一个字符左下角的y坐标

private $bgcolor; //背景色
private $fc; //文本色

private $ff; //字体文件
private $textnum; //验证码个数


function __construct()
{
$this->alltext='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
}

public function setsize( $imw=100, $imh=30, $fontsize=17, $fontsizeoffset=2, $fontangle=15, $LRO=1, $UDO=1, $firstx=10, $firsty=20)
{
$this->imgw=$imw;
$this->imgh=$imh;
$this->fs=$fontsize;
$this->fso=$fontsizeoffset;
$this->fa=$fontangle;
$this->lro=$LRO;
$this->udo=$UDO;
$this->ffldx=$firstx;
$this->ffldy=$firsty;
}

public function setcolor( $backgroudcolor='255,255,255', $textcolor='0,0,255')
{
$this->bgcolor=$backgroudcolor;
$this->fc=$textcolor; //在 addtext里面转为颜色
}

public function setother( $fontfile='arialbi.ttf', $intnum=4)
{
$this->ff=$fontfile;
$this->textnum=$intnum;
}



private function createimg()
{
$bg_arr=explode( ",", $this->bgcolor);
$im=imagecreate( $this->imgw, $this->imgh);
$bgcolor=imagecolorallocate( $im, $bg_arr[0], $bg_arr[1], $bg_arr[2]); //设置背景色

return $im;
}

private function addtext($im)
{

$fontcolor_arr=explode( ",", $this->fc);
$this->fc=imagecolorallocate( $im, $fontcolor_arr[0], $fontcolor_arr[1], $fontcolor_arr[2]);
for( $i=1; $i<=$this->textnum; $i++)
{
$text=$this->alltext{rand(0,61)};
$cheaktext=$cheaktext.$text;
imagettftext( $im, rand($this->fs - $this->fso,$this->fs + $this->fso), rand(- $this->fa,$this->fa), $this->ffldx + $i * 13+rand(- $this->lro,$this->lro), $this->ffldy + rand(- $this->udo,$this->udo), $this->fc, $this->ff, $text );
}

return $cheaktext;
}

public function showimg()
{
$im=$this->createimg();
$cheaktext=$this->addtext($im);

session_start();
$_SESSION['cheaktext']=$cheaktext;

header("Content-type: image/gif");
imagegif($im);
imagedestroy($im);
}
}


/*
*前天看了一篇关于如何用程序去识别破解验证码的文章,才发现现在很多网站的验证码都是摆设,于是决定自己写一个,
* 由于干扰点不仅对防破解没什么帮助,有时还影响阅读,所以不加上去
* 干扰线过再研究一下那篇文章,过两天有空补上来
*
*
* ============ DEMO===========
* 为能适应更多情况,可设置参数较多
*
* setsize参数说明:【$imw:图像宽度,像素】【$imh:图像高度,像素】【$fontsize:字体大小,像素】
* 【$fontsizeoffset:字体大小变化量,1-3适宜】【$fontangle:字体偏移角度,12-20适宜】
* 【$LRO:字体粘连度,1-2适宜】【$UDO:字体上下随机调整,1-3适宜】
* 【$firstx:第一个字体左下角在图片中的X坐标,自己看着办】【$firsty:第一个字体左下角在图片中的Y坐标,自己看着办】
*
* setsize参数说明:【$backgroudcolor:背景色,string,如'255,255,255'】
* 【$textcolor:字体颜色,设置同上】
*
* setother参数说明:【$fontfile:True Type字体文件所在位置,打开你电脑 C:\WINDOWS\Fonts 自己选,至于版权问题就不知道了】
* 【$intnum:字体个数,就是验证码个数】
*
* 所有参数一般都综合来设置
*
*/
$code=new cheakcode;
$code->setsize($imw=100, $imh=30, $fontsize=17, $fontsizeoffset=2, $fontangle=15, $LRO=1, $UDO=1, $firstx=10, $firsty=20);
$code->setcolor($backgroudcolor='255,255,255', $textcolor='0,0,255');
$code->setother($fontfile='arialbi.ttf', $intnum=4);
$code->showimg();


?>


...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LuciferStar 2010-12-24
  • 打赏
  • 举报
回复
那个dz的session,估计还是以cookie形式发送到客户端的。
它将明文与传送的数据进行了一个隔离,不能由一个推导出另一个,而是通过查表(数据库)来得到最终数据。
kawais 2010-12-16
  • 打赏
  • 举报
回复
最好去掉o,0,1,l,8,B这些难以区分的字符
LuciferStar 2010-12-16
  • 打赏
  • 举报
回复
看过DZ的验证码。
提交的明文跟session里数据只是在数据库里相关联,所以只能通过图像识别破解。
您这个,没细看,似乎只要知道算法,得到session,就可以推导出明文的吧?
  • 打赏
  • 举报
回复
谢谢!其实我是特意挑了一个字体文件,尽量避免这些,但是由于字体缩放
后可能还是会存在类似问题
[Quote=引用 6 楼 kawais 的回复:]

最好去掉o,0,1,l,8,B这些难以区分的字符
[/Quote]
  • 打赏
  • 举报
回复
SESSION存进数据库干嘛?直接放内存里面,客服端可以得到?

[Quote=引用 5 楼 luciferstar 的回复:]

看过DZ的验证码。
提交的明文跟session里数据只是在数据库里相关联,所以只能通过图像识别破解。
您这个,没细看,似乎只要知道算法,得到session,就可以推导出明文的吧?
[/Quote]
igaojie 2010-12-15
  • 打赏
  • 举报
回复
我没啥可说的!
楼上的 报错的话 很可能是你没有程序里的字体!~~ttf
  • 打赏
  • 举报
回复
不是吧?我没事啊,我忘了加错误处理代码,你的GD库开了没?

[Quote=引用 2 楼 zhulinjia 的回复:]

运行出错
[/Quote]
zhulinjia 2010-12-15
  • 打赏
  • 举报
回复
运行出错
  • 打赏
  • 举报
回复
我要听意见

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧