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

时间:2021-09-17 11:47:02

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

 <!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册页面</title>
<style>
*{
font-family: 微软雅黑;
}
img{
cursor: pointer;
}
</style>
</head>
<body>
<h1>用户注册:</h1>
<form action="reg.php" method='post'>
<p>用户名:</p>
<p><input type="text" name='username'></p> <p>密码:</p>
<p><input type="password" name='password'></p> <p>验证码图片:</p>
<p>
<img src="verify.php" onclick="this.src='verify.php?rand='+Math.random()">
</p> <p>输入验证码:</p>
<p><input type="text" name='fcode'></p> <p>
<input type="submit" value='Ok'>
</p>
</form>
</body>
</html>

reg.php

 <?php 

 session_start();

 $vauth=$_SESSION['vcode'];

 $fauth=$_POST['fcode'];

 $vstr=strtolower(str_replace(' ','',$vauth));
$fstr=strtolower(str_replace(' ','',$fauth));
$username=$_POST['username']; if($vstr===$fstr){
echo "验证码输入正确!";
}else{
echo "验证码输入错误!";
}
?>

verigy.php

 <?php
//开启session技术
session_start(); // 1.创建画布资源
$img=imagecreatetruecolor(150,50); // 2.准备颜色
$black=imagecolorallocate($img,0,0,0);
$white=imagecolorallocate($img,255,255,255);
$red=imagecolorallocate($img,255,0,0);
$green=imagecolorallocate($img,0,255,0);
$blue=imagecolorallocate($img,0,0,255);
$gray=imagecolorallocate($img,180,180,180); // 3.填充画布
imagefill($img,0,0,$black); $arr=array_merge(range(0,9),range(a,z),range(A,Z));
shuffle($arr);
$str=join(' ',array_slice($arr,0,4)); $_SESSION['vcode']=$str; //画字
imagettftext($img,20,0,20,35,$white,'ms.ttf',$str); //干扰素
for($i=0;$i<30;$i++){
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);
} // 5.输出最终图像或保存最终图像
header('content-type:image/png'); // 图片从浏览器上输出
imagepng($img); // 把图片保存到本地
// imagejpeg($img,'jin.jpg'); // 6.释放画布资源
imagedestroy($img); ?>