验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的。目前大大小小的网站都有验证码。今天自己实现了一个简单的验证码类。说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下。当然,因为字体的原因,要想一眼看出来并不容易。同时,为了避免字母的大小写与数字混淆,又去掉了那些看起来很像的字母数字。
类:

<?php
/**
*简单生成验证码类
*/
class Captcha {
private $width;//验证码宽度
private $height;//验证码高度
private $countOfChars;//字符数
//private $distrubLines;//干扰线条数
private $chars;//随机生成的字符串 public function __construct($width=100,$height=30,$countOfChars=4,$distrubLines=2) {
//初始化参数
$this->width=$width;
$this->height=$height;
$this->countOfChars=$countOfChars;
session_start();
} /**
* 执行全部动作,生成验证码并直接输出
*/
public function execute(){
$imageHandle=$this->createImage();
$this->createChars();
$this->drawChars($imageHandle);
$this->outImage($imageHandle);
} /**
* 创建画布,并随机填充颜色
* @return 返回画布句柄
*/
public function createImage(){
$imageHandle= imagecreate($this->width, $this->height);
//随机背景颜色
$randColor=imagecolorallocate($imageHandle, 50, mt_rand(0, 50), mt_rand(0, 50));
imagefill($imageHandle, 0, 0, $randColor);
return $imageHandle;
} /**
* 生成随机字符
*/
private function createChars(){
//候选字符
$str='ABCDEFGHJKLMNPQRSTUVWXZabcdefghijkmnpqtuvwx2346789';
$chars='';
for($i=0;$i<$this->countOfChars;$i++){
$chars.=$str[mt_rand(0,strlen($str)-1)];
}
$this->chars=$chars;
//保存在会话中
$_SESSION['captcha']=strtolower($chars);
} /**
* 将字符写入图像
* @param type $imageHandle 图像句柄
*/
private function drawChars($imageHandle){
if($this->chars!=null){
$font='/home/WWW/YuWeiLiShuFT.ttf';
for($i=0;$i<strlen($this->chars);$i++){
$color= imagecolorallocate($imageHandle,mt_rand(50, 200),mt_rand(100, 255),255);
imagefttext($imageHandle,30, 30,$i*20+10,25,$color,$font,$this->chars[$i]);
}
}
} /**
* 输出图像
* @param type $imageHandle 图像句柄
*/
private function outImage($imageHandle){
imagepng($imageHandle);
imagedestroy($imageHandle);
} /**
* 判断用户输入的验证码是否正确
* @param type $usrInput 用户的输入
* @return boolean 验证码是否匹配
*/
public static function isRight($usrInput){
if(isset($_SESSION['captcha'])){
if(strtolower($usrInput)==$_SESSION['captcha']){
$_SESSION['captcha']=null;
return true;
}else{
$_SESSION['captcha']=null;
return false;
}
}
}
}

把验证设置成了静态方法,因为生成验证码后已经把验证码存到了session中,验证时直接调用静态方法,而不需要实例化这个类了。
上面的字体可以随意设置。

下面的代码讲返回一个图像,实例化Captcha类后动态生成的一个图像。(outCaptcha.php)

<?php

require('Captcha.php');
$code= new Captcha();
header('Content-Type:image/png');
$code->execute();

header(‘Content-Type:image/png’);
这句话的作用是告诉浏览器输出的是png图像,而不是html代码。浏览器收到后就将下面的输出解析成图像。

然后写一个html静态页面(testCaptcha.html),创建表单

<!DOCTYPE html>
<html>
<head>
<title>验证码测试</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>请输入验证码:</h1>
<img src="outCaptcha.php"/>
<form method="POST" action="prove.php">
<input type="text" name="input_captcha"/>
<button name="submit">确定</button>
</form>
</body>
</html>

仅仅是这样是不够的,看到表单提交的地址了么?那个就是用来验证验证码是否输入正确的代码:

session_start();
$inputCaptcha= trim($_POST['input_captcha']);
require('Captcha.php');
if(Captcha::isRight($inputCaptcha)){
echo '验证码正确';
}else{
echo '验证码错误或已过期';
}
session_destroy();

这里还是要导入Captcha这个类,然后调用其静态方法来验证你的输入。最后销毁整个会话。

最后看看效果吧

点击确定,跳转的验证的页面:


太好了,成功了。那再故意输错试试,后退一下,然后刷新(如果不刷新浏览器将直接调用缓存中的验证码图片,这个时候我们的验证码还没有生成呢!所以无论怎么样都出错)。


当然,真正的验证码是可以单击换一张的,这利用了ajax技术。

PHP 用session与gd库实现简单验证码生成与验证的类的更多相关文章

  1. php中运用GD库实现简单验证码

    昨天学习了运用php的GD库进行验证码的实现. 首先可以用phpinfo()函数看一下GD库有没有安装,我用的wampserver是自动给安装的. 主要的步骤是: 1.生成验证码图片 2.随机生成字符 ...

  2. php中GD库的简单使用

    在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...

  3. 安装GD库解决ThinkPHP 验证码Call to undefined function Think\imagecreate()出错

    在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会提示 ...

  4. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  5. PHP 使用gd库压缩图片并生成新图片返回全路径

    使用gd库前,先检查是否开启了gd库 phpinfo(); 如果在php配置信息里找到了gd库,那么就是开启了,没开启的自行百度如何开启php gd库 既然开启了gd库,那么直接再php里写入以下代码 ...

  6. 【代码学习】GD库中简单的验证码

    大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...

  7. 【代码总结】GD库中简单的验证码

    大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...

  8. 使用Pillow库 创建简单验证码

    使用Pillow生成简单的验证码 本想做成字体各自按随机角度倾斜, 但没有在Pillow中找到相关的方法 import randomfrom PIL import Image, ImageDraw, ...

  9. 基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲…….)

    转自:http://www.blhere.com/1168.html 12345678910111213141516171819202122232425262728293031323334353637 ...

随机推荐

  1. 巧用HTML5给按钮背景设计不同的动画

      如何巧用HTML5设计按钮背景不同动画特效,在该特效中,当鼠标滑过按钮时,使用CSS3   animation 来动画   background-size  和  background-posit ...

  2. 编译时.test文件报错无法解决的方法,关闭test编译

    有几次遇到从网上下载到的iOS开源代码编译报错,报错位置为Test Target的源文件,我就挺奇怪我又没做测试为啥会编译Test Target的源文件,之前的暴力解决方法是把Test Target直 ...

  3. iOS 消息推送原理及实现总结 分类: ios技术 2015-03-01 09:22 70人阅读 评论(0) 收藏

    在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服 ...

  4. 转:HTTPS 升级指南

    上一篇文章我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效. 为了升级到 HTTP/2 协议,必须先启用 HTTPS.如果你不了解 HTTPS 协议(学名 TLS 协议),可以参考我 ...

  5. vuejs 父组件向子组件传递($broadcast()的用法)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【翻译】使用Visual Studio在Azure上部署Asp.Net Core Web应用

    配置运行环境 Install the latest Azure SDK for Visual Studio. The SDK installs Visual Studio if you don't a ...

  7. js blob

    Blob 是什么? 这里说的是一种JavaScript的对象类型. Oracle 中也有类似的栏位类型. 在 [JS进阶] HTML5 之文件操作(file) 这一篇中用到了File对象,而实际上 f ...

  8. 记一次DG搭建过程中备库ORA-00210,ORA-00202,ORA-27086错误

    ORA-00210: cannot open the specified control file ORA-00202: control file: '/u01/app/oracle/oradata/ ...

  9. RMAN-06217: not connected to auxiliary database with a net service name

    RMAN> duplicate target database to clonedb from active database; Starting Duplicate Db at 28-JAN- ...

  10. 用《VisualStudio命令提示》生成WSDL客户端文件

    1.找到vs命令提示符并且以管理员方式打开. 2.输入:wsdl + wsdl文件路径(可以为url).如:“wsdl http://localhost:30373/PDAWebService/SH3 ...