PHP100的视频中有讲验证码的,处于对技术的热爱,今天花几个小时研究了一下验证码的安全与破解。
破解肯定是学不会的,不过有助于我们知道什么样的验证码在机器面前是安全的。
简单的4个数字横向排列肯定是最不安全的。
总结一下,安全验证码的几个要点(中文虽然安全系数高,但是输入麻烦,暂时不计算在内)。
1.背景颜色斑斓,不单色,被计算机抽出的可能性小;
2.每个字体大小、字体名、文字位置、文字颜色随机不固定;
3.字符类型不单一,字母、字符、数字等交替。
4.字符随机重叠或者不叠,机器不易抽出。
根据自己的总结和学习,设计了下面的超级验证码的程序,下面是几个相关的截图。





点击下面查看改良后的代码:
<?php
/*
* Created on 2010-10-25
* BY��QQ542900563
* Copyrights Reserved 2000-2020
*/
//生成图床
$img2=imagecreatetruecolor(100,30);
$img=imagecreatefromjpeg("c.jpg");//载入背景图片
$size=getimagesize("c.jpg");
//print_r($size);
//通过随机背景的坐标随机背景
imagecopy($img2,$img,0,0,rand(1,($size[0]-100)),rand(1,($size[1]-30)),100,30);
//写进字符串
$sess="";
$W_pos=rand(0,20);//随机X位置
$H_pos=rand(24,34);//随机Y位置
for ($i = 0; $$i < 4; $$i++) {
$bgfont=imagecolorallocate($img2,rand(0,255),rand(0,255),rand(0,255));//随机颜色
$rand=dechex(rand(1,15));//随机字符
$sess.=$rand; //记录字符
$W_pos+=rand(5,20); //随机位置,保证后一个产生的字符打出位置在前一个字符后面而且间距不定
//由于字体比较多,这里不再随机
//有经验的通知可以做成数组,随机取数组的值就可以随机字体了
//倾斜角度可以自己定义随机
imagettftext ( $img2, 30, rand(10,50), $W_pos, $H_pos, $bgfont, "simhei.ttf", $rand );
}
session_start();
$_SESSION[name]=$sess;
header("Content-type:image/jpeg");
imagejpeg($img2);
?>
浙公网安备 33010602011771号