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); ?>
 

最新文章

  1. 【Android菜鸟学习之路】环境搭建问题-修改AVD Path
  2. .nil? .empty? .blank? .present? in Ruby on Rails
  3. [wordpress] determine_current_user 在get_current_user_id() 或者 wp_get_current_user()会调用
  4. HDU2053.JAVA
  5. mac svn命令
  6. 智能打印SDK---官方博客
  7. 项目Alpha冲刺Day7
  8. Vimtutor(中文版)学习笔记各章小结
  9. LaTeX公式中的空格
  10. git强制提交本地分支覆盖远程分支
  11. .Net 读取配置文件 xml
  12. Redis服务搭建与基础功能示例
  13. dell R720服务器设置开机启动顺序
  14. 经典SQL语句--很全面
  15. SAP 产品条码WMS结合 以及ABAP script的集成 BarCode
  16. C10K——千万级并发实现的秘密:内核不是解决方案,而是问题所在!(转)
  17. lombok 注解使用
  18. 【ghost初级教程】 怎么搭建一个免费的ghost博客
  19. 孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解
  20. 【我的Android进阶之旅】解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format

热门文章

  1. ChinaVis2015 第一天会议
  2. Android 给图片 加边框
  3. Java学习笔记十
  4. Atcoder ABC 071 C,D
  5. PS:切图
  6. DockerUI(图形化管理)
  7. hostname---显示和设置系统的主机
  8. PLSQL乱码&amp;TNS-12557: protocol adapter not loadable解决
  9. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
  10. new不抛出异常nothrow与new_handler