php课程 8-30 实现验证码验证的难点是什么

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  ?>
 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/9288977.html