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

php课程 8-30 实现验证码验证的难点是什么的更多相关文章

  1. laravel基础课程---14、表单验证(lavarel如何进行表单验证)

    laravel基础课程---14.表单验证(lavarel如何进行表单验证) 一.总结 一句话总结: lavarel的验证的功能比tp要[简单]且[强大]很多 直接控制器中:添加[规则数组]和[修改提 ...

  2. 【ThinkPHP框架学习 】(1) --- thinkphp 3.2.3 验证码验证使用教程分享

    框架版本:ThinkPHP框架     thinkphp 3.2.3 生成验证码 下面是最简单的方式生成验证码: $Verify = new \Think\Verify(); $Verify-> ...

  3. JFinal Web开发学习(六)验证码验证和注册细节

    效果: 实现了注册界面的验证码验证.确认密码.密码md5加盐加密.C3P0插件数据库操作.读取外部配置文件. 1.在注册页面添加了确认密码输入框,修改了字段名称 <!DOCTYPE html&g ...

  4. Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式

    短信验证码在目前大多数web应用中都会有,本文介绍一个基于Yii2 Validator方式的验证码验证方式. 在其他文章中看到的方式大多比较难做到一次封装,多次重用. 使用此方式的好处自然不用多说,V ...

  5. PHP网站提交表单如何实现验证码验证功能

    很多小伙伴在原生网站时候都会遇到很多意料之外的情况发生,也有不少小伙伴在初学程序代码的时候可能会因为一个小小的逗号隐藏在几百行,几千行的代码中出错常见的在提交表单中很多事需要验证码验证,那么如何来实现 ...

  6. 模拟用户登录,内含验证码验证和request等操作

    模拟用户登录,内含验证码验证和jsp等操作 1.案例需求: 1. 访问带有验证码的登录页面login.jsp 2. 用户输入用户名,密码以及验证码. * 如果用户名和密码输入有误,跳转登录页面,提示: ...

  7. [技术博客] 用户验证码验证机制---redis缓存数据库的使用

    目录 问题引入 初识redis 实际应用 作者:马振亚 问题引入 在这次的开发过程中,我们的需求中有一个是普通用户可以通过特定的机制申请成为社长.因为只有部分人才能验证成功,所以这个最开始想了两种思路 ...

  8. 由Nginx反向代理引出的JCaptcha验证码验证失败的问题

    搜索关键字: 1)Windows本地开发正常,部署到Linux远程服务器上JCaptcha验证失败 2)Linux远程服务器上JCpatcha验证失败 3)Nginx反向代理后JCaptcha验证失败 ...

  9. PHP实现邮箱验证码验证功能

    *文章来源:https://blog.egsec.cn/archives/623  (我的主站) *本文将主要说明:PHP实现邮箱验证码验证功能,通过注册或登录向用户发送身份确认验证码,并通过判断输入 ...

随机推荐

  1. LintCode 二叉树的遍历 (非递归)

    前序: class Solution { public: /** * @param root: The root of binary tree. * @return: Preorder in vect ...

  2. easyui datagird 总计栏

    在使用easyui 的表格的时.非常多时候须要加一个总计栏,当然easyui中有加总计栏的方法,写一个footer就好,然而我认为这样的方法并不好.由于加入的总计栏是和列表每一个单元格相应的,有长度限 ...

  3. 想学android进来看看吧~ ~

    我深知学校里面有非常多同学想学习新的知识,而苦于没有指导. 事实上我想说的是,非常多东西须要靠自己,须要借助度娘,谷歌的.当然有人指导是最好的了. 对于刚接触android是不是也想做出像以下的效果: ...

  4. UDP连接调用connect()函数

    UDP是一个无连接的协议,它没有像TCP中EOF之类的东西. 8.11 UDP的connect函数 除非套接字已连接,否则异步错误是不会反悔到UDP套接字的. 我们确实能够给UDP套接字调用conne ...

  5. 14.字符串hash寻找第一个只出现一次的字符

    //char 0-255一共256个 char getonebyhash(char *str) { if (str == NULL) { return '\0'; } char ch = '\0'; ...

  6. Android Error:(1, 0) Gradle version 2.2 is required. Current version is 3.4.1.

    我们在使用Android Studio的时候新建项目没什么问题的,但是当我们下载一份Github上的项目导入进去的时候却没法正常使用,其原因主要是gradle配置问题.而由于gradle这个玩意儿版本 ...

  7. 【Pycharm】【HTML/jQuery】代码换行问题

    问题:从网上下载jQuery文件后发现代码太长,不利于阅读:Pycharm没有预先设置好js文件的自动换行设置 问题 解决办法 解决后

  8. Spring 实现数据库读写分离(转)

    现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...

  9. 3、Task.Factory属性

    3.Task.Factory属性 Task类提供了一个Factory静态属性,这个属性返回一个TaskFactory对象. Task task = Task.Factory.StartNew(Task ...

  10. C# 异步延时执行

    https://blog.csdn.net/xiawu1990/article/details/78350253?utm_source=blogxgwz7 var t = Task.Run(async ...