如何用PHP生成验证码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用PHP生成验证码相关的知识,希望对你有一定的参考价值。

php生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中。PHP生成验证码的大致流程有:

1、产生一张png的图片;

2、为图片设置背景色;

3、设置字体颜色和样式;

4、产生4位数的随机的验证码;

5、把产生的每个字符调整旋转角度和位置画到png图片上;

6、加入噪点和干扰线防止注册机器分析原图片来恶意破解验证码;

7、输出图片;

8、释放图片所占内存。

session_start(); 
getCode(4,60,20); 
 
function getCode($num,$w,$h)  
    $code = ""; 
    for ($i = 0; $i < $num; $i++)  
        $code .= rand(0, 9); 
     
    //4位验证码也可以用rand(1000,9999)直接生成 
    //将生成的验证码写入session,备验证时用 
    $_SESSION["helloweba_num"] = $code; 
    //创建图片,定义颜色值 
    header("Content-type: image/PNG"); 
    $im = imagecreate($w, $h); 
    $black = imagecolorallocate($im, 0, 0, 0); 
    $gray = imagecolorallocate($im, 200, 200, 200); 
    $bgcolor = imagecolorallocate($im, 255, 255, 255); 
    //填充背景 
    imagefill($im, 0, 0, $gray); 
 
    //画边框 
    imagerectangle($im, 0, 0, $w-1, $h-1, $black); 
 
    //随机绘制两条虚线,起干扰作用 
    $style = array ($black,$black,$black,$black,$black, 
        $gray,$gray,$gray,$gray,$gray 
    ); 
    imagesetstyle($im, $style); 
    $y1 = rand(0, $h); 
    $y2 = rand(0, $h); 
    $y3 = rand(0, $h); 
    $y4 = rand(0, $h); 
    imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED); 
    imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED); 
 
    //在画布上随机生成大量黑点,起干扰作用; 
    for ($i = 0; $i < 80; $i++)  
        imagesetpixel($im, rand(0, $w), rand(0, $h), $black); 
     
    //将数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成 
    $strx = rand(3, 8); 
    for ($i = 0; $i < $num; $i++)  
        $strpos = rand(1, 6); 
        imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black); 
        $strx += rand(8, 12); 
     
    imagepng($im);//输出图片 
    imagedestroy($im);//释放图片所占内存 

参考技术A php生成验证码,php验证码,php怎样生成验证码?
工具/原料
这个验证码较实用,大家可以应用到项目中。
方法/步骤
1.
<?php
/*设置文件头为图片输出*/
Header("Content-type: image/JPEG");

/*调用生成验证码函数*/
$checkcode = make_rand(4);

/**
 * 生成验证码字符
 * @param int $length 验证码字符长度
 * @return string
 */
function make_rand($length="32")
$str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$result="";
for($i=0;$i<$length;$i++)
$num[$i]=rand(0,25);
$result.=$str[$num[$i]];

return $result;

2.
/*调用输出验证码图片函数*/
getAuthImage($checkcode, 160, 40);

/**
 * 生成验证码图片
 * @param string $text 验证码字符
 */
function getAuthImage($text, $w, $y) 
/*设置图片的宽度和高度*/
$im_x = $w;
$im_y = $y;
/*创建图片*/
$im = imagecreatetruecolor($im_x,$im_y);
$text_c = ImageColorAllocate($im, mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
$tmpC0=mt_rand(100,255);
$tmpC1=mt_rand(100,255);
$tmpC2=mt_rand(100,255);
$buttum_c = ImageColorAllocate($im,$tmpC0,$tmpC1,$tmpC2);
imagefill($im, 16, 13, $buttum_c);
3.
/*字体文件*/
$font = 't1.ttf';
for ($i=0;$i<strlen($text);$i++)

$tmp =substr($text,$i,1);
$array = array(-1,1);
$p = array_rand($array);
$an = $array[$p]*mt_rand(1,10);//角度
$size = 28;
imagettftext($im, $size, $an, 15+$i*$size, 35, $text_c, $font, $tmp);


/*将字符写入文件中*/
$distortion_im = imagecreatetruecolor ($im_x, $im_y);
imagefill($distortion_im, 16, 13, $buttum_c);
for ( $i=0; $i<$im_x; $i++) 
for ( $j=0; $j<$im_y; $j++) 
$rgb = imagecolorat($im, $i , $j);
if( (int)($i+20+sin($j/$im_y*2*M_PI)*10) <= imagesx($distortion_im)&& (int)($i+20+sin($j/$im_y*2*M_PI)*10) >=0 ) 
imagesetpixel ($distortion_im, (int)($i+10+sin($j/$im_y*2*M_PI-M_PI*0.1)*4) , $j , $rgb);



4.
/*干扰元素点的数量*/
$count = 160;
/*创建干扰元素点*/
for($i=0; $i<$count; $i++)
$randcolor = ImageColorallocate($distortion_im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
imagesetpixel($distortion_im, mt_rand()%$im_x , mt_rand()%$im_y , $randcolor);

/*创建干扰线条*/
$rand = mt_rand(5,30);
$rand1 = mt_rand(15,25);
$rand2 = mt_rand(5,10);
for ($yy=$rand; $yy<=+$rand+2; $yy++)
for ($px=-80;$px<=80;$px=$px+0.1)

$x=$px/$rand1;
if ($x!=0)

$y=sin($x);

$py=$y*$rand2;
imagesetpixel($distortion_im, $px+80, $py+$yy, $text_c);


5.
/*以PNG格式将图像输出到浏览器*/
ImagePNG($distortion_im);

/*销毁图像*/
ImageDestroy($distortion_im);
ImageDestroy($im);

本回答被提问者和网友采纳
参考技术B 自带验证码类,有需要,这里看
http://jingyan.baidu.com/article/d45ad1488e7aa569552b80f3.html

以上是关于如何用PHP生成验证码的主要内容,如果未能解决你的问题,请参考以下文章

如何用JavaScript实现获取验证码的效果

PHP生成各种验证码和Ajax验证

代码实现PHP生成各种随机验证码

PHP GD 生成图片验证码+session获取储存验证码

如何用JS代码判断验证码输入是不是正确

php之验证码小程序