PHP简单验证码功能机制实例详解


Posted in PHP onMarch 27, 2019

本文实例讲述了PHP简单验证码功能机制。分享给大家供大家参考,具体如下:

网站的安全性是开发者不可忽视的一个问题,目前使用最多的一种可以提高网站安全性的方法就是使用验证码功能机制,有的仅仅使用一个几位数字字母混乱的验证码,有的进行手机发送短信进行验证,有的使用邮箱发送邮件进行验证,但是这个验证码功能机制是如何实现的呢?下面就为大家详细解释验证码功能机制的实现思路以及简单的实现方法。

1、验证码功能机制实现思路

① 常规的验证码实现:

a、产生一张png的图片
b、为图片设置背景色
c、设置字体颜色和样式
d、产生4位数的随机的验证码
e、把产生的每个字符调整旋转角度和位置画到png图片上
f、加入噪点和干扰线防止注册机器分析原图片来恶意注册
g、输出图片
h、释放图片所占内存
i、将验证码保存到session或是数据库
j、将和输入的验证码进行对比

② 短信(邮箱)验证码机制:

a、产生4-6位数的随机的验证码
b、把产生的每个字符保存到session或是数据库
c、将验证码发送到用户的手机(邮箱)
d、用户在规定时间内进行输入
e、将验证码从session或是数据库中取出
f、将和输入的验证码进行对比验证

2、简单的实现验证码功能机制

① 新建captcha.php,写入以下代码

<?php
/**
 * =======================================
 * Created by WeiBang Technology.
 * User: Wei ZhiHua
 * Date: 2016/10/12 0020
 * Time: 下午 4:14
 * Power: 实现验证码功能
 * =======================================
 */
//开启session
session_start();
//创建一个大小为 100*30 的验证码
$image = imagecreatetruecolor(100, 30);
$bgcolor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgcolor);
$captch_code = '';
for ($i = 0; $i < 4; $i++) {
  $fontsize = 6;
  $fontcolor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));
  $data = 'abcdefghijkmnpqrstuvwxy3456789';
  $fontcontent = substr($data, rand(0, strlen($data) - 1), 1);
  $captch_code .= $fontcontent;
  $x = ($i * 100 / 4) + rand(5, 10);
  $y = rand(5, 10);
  imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
//就生成的验证码保存到session
$_SESSION['authcode'] = $captch_code;
//在图片上增加点干扰元素
for ($i = 0; $i < 200; $i++) {
  $pointcolor = imagecolorallocate($image, rand(50, 200), rand(50, 200), rand(50, 200));
  imagesetpixel($image, rand(1, 99), rand(1, 29), $pointcolor);
}
//在图片上增加线干扰元素
for ($i = 0; $i < 3; $i++) {
  $linecolor = imagecolorallocate($image, rand(80, 220), rand(80, 220), rand(80, 220));
  imageline($image, rand(1, 99), rand(1, 29), rand(1, 99), rand(1, 29), $linecolor);
}
//设置头
header('content-type:image/png');
imagepng($image);
imagedestroy($image);
?>

② 新建form.php,写入以下代码

<?php
/**
 * =======================================
 * Created by WeiBang Technology.
 * User: Wei ZhiHua
 * Date: 2016/10/12 0021
 * Time: 下午 4:14
 * Power: 实现验证码功能
 * =======================================
 */
if (isset($_REQUEST['authcode'])) {
  session_start();
  if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']) {
    echo "输入正确!";
  } else {
    echo "输入错误!";
  }
  exit();
}
?>
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  <title>确认验证码</title>
</head>
<body>
<form method="post" action="./form.php">
  <p>验证码图片:
    <img id="captcha_img" border="1" src="./captcha.php?r=<?php echo rand(); ?>" width=100 height=30>
    <a href="javascript:void(0)" rel="external nofollow" 
      onClick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">换一个?</a>
  </p>
  <p>请输入图片中的内容:<input type="text" name="authcode" value=""/></p>
  <p><input type="submit" value="提交" style="padding:6px 20px;"></p>
</form>
</body>
</html>

以上就是php验证码的制作思路和实现方法,从简单到复杂,可以根据这些写出非常完美的验证码功能机制。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中几个常用的魔术常量
Feb 23 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
php命令行写shell实例详解
Jul 19 PHP
yii2 上传图片的示例代码
Nov 02 PHP
详解PHP PDO简单教程
May 28 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
Mar 27 #PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 #PHP
PHP判断是否微信访问的方法示例
Mar 27 #PHP
PHP中localeconv()函数的用法
Mar 26 #PHP
PHP实现的支付宝支付功能示例
Mar 26 #PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 #PHP
PHP实现微信退款的方法示例
Mar 26 #PHP
You might like
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
python 写的一个爬虫程序源码
2016/02/28 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
python和go语言的区别是什么
2020/07/20 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
护士求职自荐信范文
2014/03/19 职场文书
物理学专业自荐信
2014/06/11 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
实习班主任自我评价
2015/03/11 职场文书
2015年科协工作总结
2015/05/19 职场文书
经典爱情感言
2015/08/03 职场文书