本文章給大家介紹利用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(empty($_POST['name']))
die( '用戶名不能為空');
if(empty($_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']))
{
$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']的值就可以了。還可以對以上代碼稍微改進,改成兩個數字相加求和的形式