php课程 8-30 实现验证码验证的难点是什么
一、总结
一句话总结:session技术实现验证码传递。
1、生成验证码的那个网页(php文件)中的验证码怎么搁到别的网页中去?
直接在img的src中调用这个php的文件名即可
因为这个php文件或者说网页文件本身就是一个图片(我们在html的head头里面声明了文件类型为图片的),
所以直接用图片的方式引入即可,而不是引入文件的方式
24 <p>验证码图片:</p>
25 <p>
26 <img src="verify.php" onclick="this.src='verify.php?rand='+Math.random()">
27 </p>
2、怎么把验证码图片里面的验证码传递到后台,和用户输入的验证码做比较?
生成验证码图片那个php把验证码写到文件中,后台的文件要比较验证码的时候直接去文件中扣就行。
所以用的就是cookie和session,这里用的是session。
1 <?php
2
3 session_start();
4
5 $vauth=$_SESSION['vcode'];
6
3、session的本质是什么(session为什么可以跨文件传输变量)?
因为session是文本变量,也就是说session里面的变量都会在文件中放一份,取session的时候是取文件中取,所以session可以做到跨文件传输变量的值。
其它的变量在脚本结束的时候,变量就被释放了。
4、php原生的session使用有什么注意要点?
a、使用session必须开启session,用session_start()
b、session_start()开启session这句话之前不能有任何html输出(<?php?>之外都是html的天下)。
1 <?php
2
3 session_start();
4
5 $vauth=$_SESSION['vcode'];
6
5、如何点一下验证码图片动态刷新验证码图片?
onclick方法
24 <p>验证码图片:</p>
25 <p>
26 <img src="verify.php" onclick="this.src='verify.php?rand='+Math.random()">
27 </p>
6、为什么验证码图片刷新要加随机数作为参数?
如果没有这个随机数作为参数,浏览器发现两次请求的是同一个url,会优先从自己的缓存里面取出内容
24 <p>验证码图片:</p>
25 <p>
26 <img src="verify.php" onclick="this.src='verify.php?rand='+Math.random()">
27 </p>
二、完整的验证码实例
这里用的gd库的画字函数,所以要引入字体文件.ttf
index.php
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>用户注册页面</title> 6 <style> 7 *{ 8 font-family: 微软雅黑; 9 } 10 img{ 11 cursor: pointer; 12 } 13 </style> 14 </head> 15 <body> 16 <h1>用户注册:</h1> 17 <form action="reg.php" method='post'> 18 <p>用户名:</p> 19 <p><input type="text" name='username'></p> 20 21 <p>密码:</p> 22 <p><input type="password" name='password'></p> 23 24 <p>验证码图片:</p> 25 <p> 26 <img src="verify.php" onclick="this.src='verify.php?rand='+Math.random()"> 27 </p> 28 29 <p>输入验证码:</p> 30 <p><input type="text" name='fcode'></p> 31 32 <p> 33 <input type="submit" value='Ok'> 34 </p> 35 </form> 36 </body> 37 </html>
reg.php
1 <?php 2 3 session_start(); 4 5 $vauth=$_SESSION['vcode']; 6 7 $fauth=$_POST['fcode']; 8 9 $vstr=strtolower(str_replace(' ','',$vauth)); 10 $fstr=strtolower(str_replace(' ','',$fauth)); 11 $username=$_POST['username']; 12 13 if($vstr===$fstr){ 14 echo "验证码输入正确!"; 15 }else{ 16 echo "验证码输入错误!"; 17 } 18 ?>
verigy.php
1 <?php 2 //开启session技术 3 session_start(); 4 5 // 1.创建画布资源 6 $img=imagecreatetruecolor(150,50); 7 8 // 2.准备颜色 9 $black=imagecolorallocate($img,0,0,0); 10 $white=imagecolorallocate($img,255,255,255); 11 $red=imagecolorallocate($img,255,0,0); 12 $green=imagecolorallocate($img,0,255,0); 13 $blue=imagecolorallocate($img,0,0,255); 14 $gray=imagecolorallocate($img,180,180,180); 15 16 // 3.填充画布 17 imagefill($img,0,0,$black); 18 19 $arr=array_merge(range(0,9),range(a,z),range(A,Z)); 20 shuffle($arr); 21 $str=join(' ',array_slice($arr,0,4)); 22 23 $_SESSION['vcode']=$str; 24 25 //画字 26 imagettftext($img,20,0,20,35,$white,'ms.ttf',$str); 27 28 //干扰素 29 for($i=0;$i<30;$i++){ 30 imagearc($img,mt_rand(0,150),mt_rand(0,50),mt_rand(0,150),mt_rand(0,50),mt_rand(0,360),mt_rand(0,360),$white); 31 } 32 33 // 5.输出最终图像或保存最终图像 34 header('content-type:image/png'); 35 36 // 图片从浏览器上输出 37 imagepng($img); 38 39 // 把图片保存到本地 40 // imagejpeg($img,'jin.jpg'); 41 42 // 6.释放画布资源 43 imagedestroy($img); 44 45 ?>