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

<?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. js div截取字符串的长度

    <div style="width:100%;" id="changdu">这个是字符串的长度</div> $("#chang ...

  2. IOS第三方数据库--FMDB

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  3. Visual Studio Team Services 帐户管理操作

    Visual Studio Team Services 网址: https://www.visualstudio.com/ 1.登陆 2.登陆后新建账户 3.删除团队项目 (1)点击自己的Visual ...

  4. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  5. KNN算法--物以类聚,人以群分

    KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>= ...

  6. 《R包的分类介绍》

    R分析空间数据(Spatial Data) R机器学习包(Machine Learning) R多元统计包(Multivariate Statistics) R药物(代谢)动力学数据分析包 R计算计量 ...

  7. 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)

    This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...

  8. C++第三天学习

    回顾: 类和对象 class 类名 { public: private: 在类的类部可以访问,在类的外部不能直接访问. protected: 在类的类部可以访问,在类的外部不能直接访问,其子类可以访问 ...

  9. spring 里面的StringUtils,先放这儿,有时间研究吧

    /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Vers ...

  10. Java线程:总结

    线程的状态转换图: new:新建状态 Runnable:就绪状态.线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. Run ...