php 数字 字母组合,使用php生成数字、字母组合验证码(一)

项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略。实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码:

所用语言php,gd库

原理解释:

a>实质上是在服务器端随机生成验证码,将其存储在$_SESSION中。

b>然后将验证码写在图片上,将图片发送至客户端,用户输入图片的上的验证码,递交给服务器。

c>服务端再与$_SESSION中存储的信息比对,一致则通过,否则不通过。

e52f3f59e1fb690a4f41a96b5d029596.png

分为两步:

1)第一步服务器端生成验证码

2)客户端使用验证码

第一步:在服务器端如何生成验证码:

session_start();

//1>session_start()必须置于最顶部,2>多服务器,要考虑集中管理session信息

//phpinfo();//打印出php的信息

//1.生成一张底图(width:100;height:30)

$image=imagecreatetruecolor(100,30);

$bgcolor=imagecolorallocate($image,255,255,255);//画笔着色

imagefill($image,0,0,$bgcolor);//将底图的着色

//随机生成四个数字

/*

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

$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));

$fontcontent=rand(0,9);//验证码的内容

$fontsize=6;//字体大小

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

$y=rand(5,10);//Y轴

imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//使用imagestring()将文字写在画布上

}

*/

$captch_code="";

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

$fontsize=6;

$fontcolor=imagecolorallocate($image,rand(20,100),rand(30,100),rand(10,200));

$str="abcdefghkmnpwsert1234567890";//给出一个字符串,用于生成随机验证码

$fontcontent=substr($str,rand(0,strlen($str)),1);//每次截取一个字符

$captch_code.=$fontcontent;//拼接

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

$y=rand(5,10);

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

}

$_SESSION['authcode']=$captch_code;//保存在session中

//添加干扰点

for($i=0;$i<100;$i++){

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

imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);

}

//添加干扰线

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

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

imageline($image,rand(5,95),rand(5,25),rand(5,95),rand(5,25),$linecolor);

}

ob_clean();//清空缓存

header("content-type:".'image/png');//输出图片的头文件固定格式(可以是image/jpg、image/png、)

imagepng($image);//向浏览器输出一张图片

imagedestroy($image);//销毁内存中的底图

//session_start

第二步:将生成的验证码图片返回给客户端

header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况

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

session_start();//使用$_SESSION之前必须使用session_start()

if(strtolower($_REQUEST['authcode'])==$_SESSION["authcode"]){//$_SESSION['authcode']是服务器端存储的验证码,$_REQUEST['authcode']获取客户端输入的信息

echo "输入正确";

}

else{

echo "输入错误";

}

exit();

}

?>

验证码正确

验证码图片:

//点击验证码图片本身进行验证码的切换(需求一)

//生成随机数字,便于访问服务端,如果地址是相同的则浏览器不会刷新访问

        

οnclick="this.src='code.php?+ Math.random()'">

//点击‘点击切换’,切换验证码(需求二)

点击切换?

请输入验证码的内容:

几点异常:

1): 如果出现乱码的情况:header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况

2):如果验证码图片不能显示在前端:那可能是缓存的问题:

事实截图:

c3eb9d0325e16b379dd9c5eacf76e9a5.png

内容来源于网络如有侵权请私信删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值