PHP 用session与gd库实现简单验证码生成与验证的类
验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的。目前大大小小的网站都有验证码。今天自己实现了一个简单的验证码类。说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下。当然,因为字体的原因,要想一眼看出来并不容易。同时,为了避免字母的大小写与数字混淆,又去掉了那些看起来很像的字母数字。
类:
<?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库实现简单验证码生成与验证的类的更多相关文章
- php中运用GD库实现简单验证码
昨天学习了运用php的GD库进行验证码的实现. 首先可以用phpinfo()函数看一下GD库有没有安装,我用的wampserver是自动给安装的. 主要的步骤是: 1.生成验证码图片 2.随机生成字符 ...
- php中GD库的简单使用
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
- 安装GD库解决ThinkPHP 验证码Call to undefined function Think\imagecreate()出错
在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会提示 ...
- php使用GD库实现图片水印和缩略图——封装成类
学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...
- PHP 使用gd库压缩图片并生成新图片返回全路径
使用gd库前,先检查是否开启了gd库 phpinfo(); 如果在php配置信息里找到了gd库,那么就是开启了,没开启的自行百度如何开启php gd库 既然开启了gd库,那么直接再php里写入以下代码 ...
- 【代码学习】GD库中简单的验证码
大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...
- 【代码总结】GD库中简单的验证码
大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...
- 使用Pillow库 创建简单验证码
使用Pillow生成简单的验证码 本想做成字体各自按随机角度倾斜, 但没有在Pillow中找到相关的方法 import randomfrom PIL import Image, ImageDraw, ...
- 基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲…….)
转自:http://www.blhere.com/1168.html 12345678910111213141516171819202122232425262728293031323334353637 ...
随机推荐
- 在IOS应用中从竖屏模式强制转换为横屏模式
http://www.cnblogs.com/mrhgw/archive/2012/07/18/2597218.html 在 iPhone 应用里,有时我们想强行把显示模式从纵屏改为横屏(反之亦然), ...
- JDBC操作数据时中文乱码
/** * DB地址 */ private static final String DB_URL="jdbc:mysql://localhost:3306/db_book?useUnicod ...
- @synthesize和@dynamic
@synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法.当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成g ...
- 试水MongoDB
1)安装好后启动mongodb 服务 1_1) 建立data/db ,保证至少有3g大小的盘 1_2) 建立log 文件夹 1_3)配置文件 内容,指定数据存放位置.日志文件位置 dbpath ...
- DrawerLayout学习笔记
基本步骤: 1>在XML中将DrawerLayout作为根视图 2>根视图中放两个View,第一个是主视图,即DrawerLayout隐藏的时候的视图,第二是就DrawerLayout的视 ...
- IOS开发-ObjC-Category的使用
在IOS移动App开发中,经常会出现以下情况:定义好了一个类,但后来需求升级或改变之后需要对这个类增加功能,这样的话往往需要修改类的结构,这样就会导致不能预期的问题产生,所以Obj-C提供了一种叫做C ...
- java中的Set的使用以及各种遍历方法(较为全面)
1. 概述 Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品 ...
- KMP算法之查找模式串在源串中出现的次数
问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题 ...
- Windows server 2008 R2 64位系统安装ZendOptimizer-3.3.0a-Wind
如果不安装ZEND的话,一些PHP网站程序使用ZEND加密后就无法使用,比如DISCUZ,SHOPEX,ECSHOP等,所以要想安装这些程序,ZEND是一定要安装的,要不会出现乱码等问题. 安装ZEN ...
- js架构设计模式——前端MVVM框架设计及实现(一)
前端MVVM框架设计及实现(一) 最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我 ...