php验证码类
validation.class.php
<?php class ValidationCode{ private $width; private $height; private $codeNum; private $image;//图像资源 private $distrubColorNum;//设置干扰元素数目 private $checkCode; function __construct($width=80,$height=20,$codeNum=4){ $this->width=$width; $this->height=$height; $this->codeNum=$codeNum; $this->checkCode=$this->createCheckCode(); $number=floor($width*$height/15); if($number>240-$codeNum){ $this->disturbColorNum=240-$codeNum; }else{ $this->disturbColorNum=$number; } } //通过访问该方法向浏览器中输出验证码图像 function showimage($fontFace=""){ //第一步:创建图像背景 $this->createImage(); //第二步:设置干扰元素 $this->setDistrubColor(); //第三步:向图像中输出随机文本 $this->outputText($fontFace); //第四叔:输出图像 $this->outputImage(); } //通过调用该方法获取随机创建的验证码字符串 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(225,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);//此处应该-1,因为在画矩形边框时,会在外边框上画,不减一的话,下面两条边框看不出来 } private function setDistrubColor(){ 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(150,255),rand(150,255),rand(150,255)); imagearc($this->image,rand(-10,$this->width),rand(-10,$this->height),rand(30,300),rand(20,200),55,44,$color); } } //此处有疑问,是否可以直接返回char,以便调用 private function createCheckCode(){ $code="23456789abcdefghigkmnpqrstuvwxyzABCDEFGHIGKMNPQRSTUVWXYZ"; $string=""; for($i=0;$i<$this->codeNum;$i++){ $char=$code{rand(0,strlen($code)-1)}; $string.=$char; } return $string; } 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+3; $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+5,$this->height-8); imagettftext($this->image,$fontSize,rand(-30,30),$x,$y,$fontcolor,$fontFace,$this->checkCode{$i}); } } } private function outputImage(){ if(imagetypes()&IMG_GIF){ header("Content-Type:image/gif"); imagegif($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"); imagewbmp($this->image); }else{ die("PHP不支持图像创建"); } } function __destruct(){ imagedestroy($this->image); }
} ?>
login.php
<?php
session_start();
echo $_POST["code"]."<br>";
echo $_SESSION["code"]."<br>";
if(strtoupper($_POST["code"])==strtoupper($_SESSION["code"])){
echo "ok";
}else{
echo "error";
}
?>
<body>
<form action="login.php" method="post">
user:<input type="text" name="username"><br>
pass:<input type="password" name="pass"><br>
code:<input type="text" name="code" onkeyup="if(this.value!=this.value.toUpperCase())this.value=this.value.toUpperCase()"><img src="code.php" onclick="this.src='code.php?'+Math.random()"><br>
<input type="submit" name="sub" value="login">
</form>
</body>
code.php
<?php
session_start();
include "validationcode.class.php";
$code= new ValidationCode();
$code->showImage("simsun.ttc");//输出到页面中供注册或登录使用
$_SESSION["code"]=$code->getCheckCode();//将验证码保存到服务器中
?>

浙公网安备 33010602011771号