php验证码生成程序代码
本文章给大家介绍利用session存储与gd库一并生成验证码程序,同时会加入一些干扰元素,这样就可以简单的防机器注册了,下面我来给各位同学介绍介绍.
PHP验证码并生成图片程序,采用了session识别,稍微改进了一下目前网络上流传的PHP验证码,加入杂点,数字颜色随机显示,控制4位数字显示,话不多说了,程序如下,分享出来.
新建yz.php验证码生成文件,以下代码需要打开php的GD库,修改php.in文件的配置,把已经注释掉的行之前的分号取消即可:extension=php_gd2.dll,代码如下:
<?php
class ValidationCode {
//属性
private $width;
private $height;
private $codeNum;
private $image;
private $disturbColorNum; //干扰元素数目
private $checkCode;
function __construct($width = 80, $height = 20, $codeNum = 4) {
$this->width = $width;
$this->height = $height;
$this->codeNum = $codeNum;
$number = floor($width * $height / 15);
if ($number > 240 - $codeNum) {
$this->disturbColorNum = 240 - $codeNum;
} else {
$this->disturbColorNum = $number;
}
$this->checkCode = $this->createCheckcode();
}
function getCheckCode() {
return $this->checkCode;
}
private function createImage() {
$this->image = imagecreatetruecolor($this->width, $this->height);
$backcolor = imagecolorallocate($this->image, rand(225, 255) , rand(225, 255) , rand(255, 255));
imagefill($this->image, 0, 0, $backcolor);
$border = imagecolorallocate($this->image, 0, 0, 0);
imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
}
private function setDisturbColor() {
for ($i = 0; $i < $this->disturbColorNum; $i++) {
$color = imagecolorallocate($this->image, rand(0, 255) , rand(0, 255) , rand(0, 255));
imagesetpixel($this->image, rand(1, $this->width - 2) , rand(1, $this->height - 2) , $color);
}
for ($i = 0; $i < 10; $i++) {
$color = imagecolorallocate($this->image, rand(0, 255) , rand(0, 255) , rand(0, 255));
imagearc($this->image, rand(-10, $this->width) , rand(-10, $this->height) , rand(30, 300) , rand(20, 300) , 55, 44, $color);
}
}
private function outputText($fontFace = "") {
for ($i = 0; $i < $this->codeNum; $i++) {
$fontcolor = imagecolorallocate($this->image, rand(0, 128) , rand(0, 128) , rand(0, 128));
if ($fontFace == "") {
$fontsize = rand(3, 5);
$x = floor($this->width / $this->codeNum) * $i + 5;
$y = rand(0, $this->height - 15);
imagechar($this->image, $fontsize, $x, $y, $this->checkCode{$i}, $fontcolor);
} else {
$fontsize = rand(12, 16);
$x = floor(($this->width - 8) / $this->codeNum) * $i + 8;
$y = rand($fontsize, $this->height - 8);
imagettftext($this->image, $fontsize, rand(-45, 45) , $x, $y, $fontcolor, $fontFace, $this->checkCode{$i});
}
}
}
private function createCheckCode() {
$code = "23456789abcdefghijkmnpqrstuvwrst";
$str = "";
for ($i = 0; $i < $this->codeNum; $i++) {
$char = $code{rand(0, strlen($code) - 1) };
$str.= $char;
}
return $str;
}
private function outputImage() {
if (imagetypes() & IMG_GIF) {
header("Content-Type:image/gif");
imagepng($this->image);
} else if (imagetypes() & IMG_JPG) {
header("Content-Type:image/jpeg");
imagepng($this->image);
} else if (imagetypes() & IMG_PNG) {
header("Content-Type:image/png");
imagepng($this->image);
} else if (imagetypes() & IMG_WBMP) {
header("Content-Type:image/vnd.wap.wbmp");
imagepng($this->image);
} else {
die("PHP不支持图片验证码");
}
}
//通过该方法向浏览器输出图像
function showImage($fontFace = "") {
//创建图像背景
$this->createImage();
//设置干扰元素
$this->setDisturbColor();
//向图像中随机画出文本
$this->outputText($fontFace);
//输出图像
$this->outputImage();
}
function __destruct() {
imagedestroy($this->image);
}
}
function checklogin() {
if (emptyempty($_POST['name'])) die('用户名不能为空');
if (emptyempty($_POST['password'])) die("密码不能为空");
if ($_SESSION['code'] != $_POST['vertify']) die("验证码输入不正确" . $_SESSION['code']);
$username = $_POST['name'];
$password = md5($_POST['password']);
//检查是否存在
conndb($username, $password);
}
function conndb($name = "", $ps = "") {
$conn = mysql_connect('localhost', 'root', '123456');
if (!$conn) die("数据库连接失败" . mysql_error());
mysql_select_db('5kan', $conn) or die('选择数据库失败' . mysql_error());
mysql_set_charset('utf8', $conn);
$sql = "select id from k_user where username='{$name}' and password='{$ps}'";
$result = mysql_query($sql) or die("SQL语句错误" . mysql_error());
if (mysql_num_rows($result) > 0) die("登录成功");
else die("用户名或者密码错误");
mysql_close($conn);
}
session_start();
if (!isset($_POST['randnum'])) { //开源代码phprm.com
$code = new ValidationCode(120, 20, 4);
$code->showImage("comicbd.ttf"); //显示在页面
$_SESSION['code'] = $code->getCheckCode(); //保存在服务器中
} else {
checklogin();
}
?>到具体调用的地方,用这样的形式:<img src="/yz.php" align="absmiddle" />就可以了;验证的时候验证session:$_SESSION['VCODE']的值就可以了,还可以对以上代码稍微改进,改成两个数字相加求和的形式.
文章网址:http://www.phprm.com/tuxiang/fs4642.html
随意转载^^但请附上教程地址。