28 验证码绘制

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 路老师分享了如何使用PHP生成验证码并实现登录验证功能。文章详细介绍了验证码的生成过程,包括创建 `verify.php` 文件、定义验证码参数、选取随机字符、设置样式、添加干扰点以及生成最终的验证码图像。此外,还展示了如何在登录页面 `login.php` 中使用验证码,并编写了 `checkLogin.php` 文件来校验用户输入的验证码和登录信息。最后,通过几个操作案例演示了验证码的有效性和登录流程。

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享

路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。

image.gif 编辑


 上篇文章简单的介绍了PHP的图像处理技术,本文我们实现一个验证码生成技术的讲解并实现一个登录验证功能。

1 生成验证码

验证码功能的实现方式很多,有数字验证码、图像验证码和文字验证码,今天我们使用的是图像生成的英文数字验证码。图像生成验证码常用于用户登录过程中。

1.1 创建verify.php

创建verify.php文件,用于生成验证码。第一步要先配置session存储。

//初始化session变量
  session_start();

image.gif

1.2 定义验证码参数

接下来定义验证码的属性:

//图像宽和高
  $image_width = 100;
  $image_height = 30;
  //生成4个字符的验证码
  $length = 4;
  //验证码文字库不包含0 1 l o等易混淆的字符
  $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVW";
  $code = '';

image.gif

1.3 选取随机4个字符

我们随机从$str中选取4个字符作为验证码,存储到Session中:

for($i = 0;$i<$length;$i++) {
    $code.=$str[mt_rand(0,strlen($str)-1)];
  }
  //将编码存储到session中
  $_SESSION["verify"] = $code;

image.gif

1.4 设置样式

此时验证码文字内容已经知道了,就需要展示到验证码图片上了。接下来是绘制图像部分代码:

//绘制图像
  $image = imagecreate($image_width,$image_height);
  //设置白色背景
  imagecolorallocate($image,255,255,255);
  //设置字体
  $fnt = "C:/Windows/Fonts/MTCORSVA.TTF";
  imageTTFText($image,30,0,15,35,$textcolor,$fnt,$code);
  //随机设置每个字符的大小和颜色
  for($i=0;$i<strlen($_SESSION["verify"]);$i++){
    $font = mt_rand(3,30);
    $x = mt_rand(2,6)+$image_width*$i/4;
    $y = mt_rand(6,$image_height/4);
    $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
    imagestring($image,$font,$x,$y,$_SESSION["verify"][$i],$color);
  }

image.gif

1.5 干扰点

一般验证码里面都会有一些干扰点,同样我们也添加一些干扰点,并设置干扰点颜色:

//绘制干扰点元素
  $pixel = 30;
  $black = imagecolorallocate($image,0,200,0);
  for($i=0;$i<$pixel;$i++){
    imagesetpixel($image,mt_rand(0,$image_width-1),mt_rand(0,$image_height-1),$black);
  }

image.gif

1.6 产品出炉

最后,指定图像生成格式并生成验证码:

// 告诉浏览器该页面的内容是一张图片
  header('Content-Type: image/png');
  imagepng($image);
  imagedestroy($image);

image.gif

1.7 效果展示

这样,验证码就能够生成出来了,看效果:

image.gif 编辑

2 验证码使用

2.1 创建login.php

创建登录文件,并将验证码放进去:

<!DOCTYPE html>
<html lang="en" class="is-centered is-bold">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>登录页面</title>
  <link href="css/login.css" rel="stylesheet">
</head>
<body>
  <section style="background: transparent;">
    <form class="box py-3 px-4 px-2-mobile"  role="form"  method="post" action="checklogin.php" onsubmit="return check()" >
   <div class="is-flex is-column is-justified-to-center">
    <h1 class="title is-3 mb-a has-text-centered">
        登录
    </h1>
    <div class="inputs-wrap py-3">
      <div class="control">
        <input class="input" type="text" id="username" name="username" placeholder="用户名"   required></input>
      </div>
      <div class="control">
        <input class="input" type="password" id="password" name="password" placeholder="密码"   required></input>
      </div>
      <div class="control">
        <input class="input" type="text" id="verify" name="verify" placeholder="验证码" style="width:80px;"  required></input>
        <a href="javascript:;" style="vertical-align: middle;">
          <!-- 显示验证码,点击重新生成验证码 -->
           <img src="verify.php" onClick="this.src=this.src+'?'+Math.random()">
        </a>
      </div>
      <div class="control">
        <button class="button is-submit is-primary is-outlined" type="submit">
          提交
        </button>
      </div>
    </div>
   </div>
    </form>
  </section>
</body>
</html>

image.gif

注意:核心代码在这里:

image.gif 编辑

效果如下:

image.gif 编辑

2.2 编写checkLogin.php

顾名思义,是校验登录和验证码的逻辑文件:

<?php 
  //启动Session
  session_start();
  header('Content-Type: text/html; charset=utf-8');
  if(isset($_POST['username']) && isset($_POST['password'])){
    $username = trim($_POST['username']);
    $password = md5(trim($_POST['password']));
    require "config.php";
    try {
      $pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PWD);
    } catch (PDOException $e) {
      echo $e->getMessage();
    }
    $check = trim($_POST["verify"]);
    if($check == ''){
      echo "<script>alert('验证码不能为空!');
      window.location.href='login.php';</script>";
    }
    if($check == $_SESSION['verify']){
      $sql = 'select * from users where username = :username and password = :password';
      $result = $pdo->prepare($sql);
      $result->bindParam(':username',$username);
      $result->bindParam(':password',$password);
      if($result->execute()){
          $rows=$result->fetch(PDO::FETCH_ASSOC);
          if($rows){
            $_SESSION['username']=$rows['username'];
            echo "<script>alert('恭喜您,登录成功!');
            window.location.href='index1.php';</script>";
          }else{
            echo "<script>alert('用户名或密码错误,登录失败!');
            history.back();</script>";
            exit();
          }
      }else{
        echo "<script>window.location.href='login.php';</script>";
      }
    } else{
      echo "<script>alert('验证码输入不正确!');
      window.location.href='login.php';</script>";
    }
    
  }
 
?>

image.gif

2.3 登录成功页面

<?php
date_default_timezone_set('PRC');
session_start();
//如果cookie不存在,那就是第一次访问网站
if(!isset($_SESSION["username"])){
    echo "<script>alert('请先登录');
           window.location.href='login.php';</script>";
}  
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>欢迎界面</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container">
    <div class="jumbotron" style="background-color:#b1f1f3">
       <h1>
          <span style="color:white;font-weight:700">
            <?php echo $_SESSION['username']; ?>
          </span>
          大佬,你好厉害!
       </h1>
       <p><a  class="btn btn-warning btn-lg" href="logout.php" role="button">退出登录</a></p>
    </div>
</body>
</html>

image.gif

2.4 操作案例

1 验证码输入框里输入一个空格,点击登录:

image.gif 编辑

返回结果提示,验证码不能为空

image.gif 编辑

2 输入验证码错误的时候

image.gif 编辑

提示验证码输入不正确

image.gif 编辑

3 输入正确的验证码后

image.gif 编辑

成功登录,并进入index.php页面

image.gif 编辑

下一篇 JpGraph图像绘制库

相关文章
|
4天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
7天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
4天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
13天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
15天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
4天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
499 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
10天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
985 3
|
8天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
401 16
白话文讲解大模型| Attention is all you need
|
8天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
560 5
|
4天前
|
安全 网络安全
您有一份网络安全攻略待领取!!!
深入了解如何保护自己的云上资产,领取超酷的安全海报和定制鼠标垫,随时随地提醒你保持警惕!
694 1
您有一份网络安全攻略待领取!!!