php保存手机验证码到session,PHP生成验证码+session获取存储验证码

最近在搞一个网站,弄到了验证码那一部分,现在自己对于php不是太了解,于是直接从网上搜了点资源,分析了一下。

验证码的实现分为四个部分:

(1)生成底图

(2)生成验证内容

(3)生成验证图片

(4)校验验证内容

先查看你的php是否开启了gd库支持,这个自行百度。

show you the code!

这是captcha.php文件代码,生成纯数字的代码已经被我注释掉了,现在可以生成数字与字母的混合验证。

session_start();//开启session,处于程序的最顶部

$image=imagecreatetruecolor(100,30);//创建底图

$bgcolor=imagecolorallocate($image,255,255,255);//设置颜色

imagefill($image,0,0,$bgcolor);//填充颜色

//下面是纯数字的验证码

/*for($i=0;$i<4;$i++)

{

$fontsize=6;

$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//设置数字颜色,颜色要深

$fontcontent=rand(0,9);//生成随机内容

$x=($i*100/4)+rand(5,10);

$y=rand(5,10);

/*这个$X,$Y的坐标是绘制文字的左上角坐标

Y高度是30 要能在背景里 $Y值+文字的高度要<30; 所以rand(5,20)会超出范围

X于此类似 因为X方向最长是100总共4个字符 100/4是每个字符的间距 用在循环中就表示 4个的起始点分别是0,25 ,50,75 然后再加上随机数有浮动效果

*/

//imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//显示资源

//}

//下方是数字与字母的混合体

$captch_code="";//存储返回的字符

for($i=0;$i<4;$i++)

{

$fontsize=6;

$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//设置数字颜色,颜色要深

$data='qwertyuiopkjhgfdsazxcvbnm123456789';//设置字典数据

$fontcontent=substr($data,rand(0,strlen($data)),1);//取一个字典中的数据

$captch_code.=$fontcontent;//将取出的数据合取到captch_code中

$x=($i*100/4)+rand(5,10);

$y=rand(5,10);

imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);

}

//echo $captch_code;

$_SESSION['authcode']=$captch_code;

//设置点的干扰元素

for($i=0;$i<200;$i++)

{

$pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));//设置点的颜色,颜色要浅

imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);//显示资源

}

//增加线的干扰元素

for($i=0;$i<3;$i++)

{

$linecolor=imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));

imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);

}

header('content-type:image/png');

imagepng($image);//显示图片

imagedestroy($image);//销毁资源

?>

下面是form.php文件的代码,界面处理。

if(isset($_REQUEST['authcode']))//判断authcode变量是否被设置

{

session_start();

if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) //增加验证码的正确性,将用户输入的字符都变成小写

{

//header('Content-type: text/html; charset=UTF8');

echo '输入正确';

}

else{

// header('Content-type: text/html; charset=UTF8');

echo '输入错误';

}

exit();

}

?>

登陆界面

验证码图片:captcha.php?r=<?php%20echo%20rand();?>

换一个?

请输入图片的内容:

直接在服务器上打开form.php即可进行验证,另外本人知识有限,有什么不对的地方,希望大家批评指正!谢谢!

0818b9ca8b590ca3270a3433284dd417.png

我又来了,下面是汉字的验证码,其实汉字和数字的存储验证方式是一样的,只是生成验证码内容的方式不同。

下面是汉字验证码处理界面

form_cn.php

if(isset($_REQUEST['authcode']))

{

session_start();

if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode'])

{

header('Content-type: text/html; charset=UTF8;');

echo '输入正确,更多功能正在完善';

}

else{

header('Content-type: text/html; charset=UTF8');

echo '输入错误,更多功能正在完善';

}

exit();

}

header('Content-type: text/html; charset=UTF8');

?>

确认验证

验证码图片:captcha_cn.php?r=<?php%20echo%20rand();?>

换一个?

请输入图片的内容:

下面是汉字验证码生成文件captcha_cn.php

session_start();

$image=imagecreatetruecolor(200, 60);

$bgcolor=imagecolorallocate($image, 255, 255, 255);

imagefill($image, 0, 0, $bgcolor);

$fontface='a.ttf'; //字体一定要命名为英文

$str="的一是在小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批如应形想制心样干都向变关点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然问比展那它最及外没看治细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝";

$strdb=str_split($str,3);//将字符串转换为数组

//header('content-type:text/html; charset=utf-8');

//var_dump($strdb);

//die();

$captch_code='';

for($i=0;$i<4;$i++)//写汉字

{

$fontcolor=imagecolorallocate($image,rand(0,120), rand(0,120), rand(0,120));//字体颜色

$index=rand(0,count($strdb));

$cn=$strdb[$index];

$captch_code.=$cn;

imagettftext($image, mt_rand(20,24), mt_rand(-60,60),(40*$i+20), mt_rand(30,35), $fontcolor, $fontface, $cn);

//imagettftext(image, size, angle, x, y, color, fontfile, text)

}

$_SESSION['authcode']=$captch_code;

for ($i=0; $i < 200; $i++) //干扰点

{

$pointcolor=imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200));

imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor);

}

for ($i=0; $i < 3; $i++) //干扰线

{

$linecolor=imagecolorallocate($image, rand(80,220), rand(80,220), rand(80,220));

imageline($image, rand(1,199), rand(1,59),rand(1,199), rand(1,59), $linecolor);

}

header('content-type: image/png');

imagepng($image);

imagedestroy($image);

?>

汉字部分自己可以在增加点文字。好了,就是这样,先告一段落,等我学完php后应该会对这些东西进行一次分析。

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值