`
sagahl
  • 浏览: 24059 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

PHP验证框

阅读更多

接触PHP一个星期了,boss要写一个图片验证框。在网上查了很多的资料,总结后得到如下最终的代码。以下代码生成的验证码有干扰条,干扰像素,字体旋转等。如果有不足的地方请回帖。

<?php
header("Pragma: no-cache");
header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");
session_start();
unset ($_SESSION['validate']);

$strnum = 8; //产生密码的位数
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //显示的字符范围

$font_file = 'Fregne Myriad v2.ttf';//指定字体文件

$disturbpiont = true; //是否显示干扰素
$disturbpiontnum = 600; //干扰素的点的数目
$disturbline = true; //是否有干扰条
$disturblinenum = 8; //干扰条的数目

$l = strlen($str);

$randStr = array ();
$validate;
for ($i = 0; $i < $strnum; ++ $i) {
	$randStr[$i] = $str[rand(0, $l)];
}

for ($i = 0; $i < $strnum; ++ $i) {
	if ($randStr[$i] == '')
		$randStr[$i] = '*';
	$validate = $validate . $randStr[$i];
}


function RgbToHsv($R, $G, $B) {
	$tmp = min($R, $G);
	$min = min($tmp, $B);
	$tmp = max($R, $G);
	$max = max($tmp, $B);
	$V = $max;
	$delta = $max - $min;

	if ($max != 0)
		$S = $delta / $max; // s
	else {
		$S = 0;
		return;
	}
	if ($R == $max)
		$H = ($G - $B) / $delta; // between yellow & magenta
	else
		if ($G == $max)
			$H = 2 + ($B - $R) / $delta; // between cyan & yellow
	else
		$H = 4 + ($R - $G) / $delta; // between magenta & cyan

	$H *= 60; // degrees
	if ($H < 0)
		$H += 360;
	return array (
		$H,
		$S,
		$V
	);
}

function HsvToRgb($H, $S, $V) {
	if ($S == 0) {
		// achromatic (grey)
		$R = $G = $B = $V;
		return;
	}

	$H /= 60; // sector 0 to 5
	$i = floor($H);
	$f = $H - $i; // factorial part of h
	$p = $V * (1 - $S);
	$q = $V * (1 - $S * $f);
	$t = $V * (1 - $S * (1 - $f));

	switch ($i) {
		case 0 :
			$R = $V;
			$G = $t;
			$B = $p;
			break;
		case 1 :
			$R = $q;
			$G = $V;
			$B = $p;
			break;
		case 2 :
			$R = $p;
			$G = $V;
			$B = $t;
			break;
		case 3 :
			$R = $p;
			$G = $q;
			$B = $V;
			break;
		case 4 :
			$R = $t;
			$G = $p;
			$B = $V;
			break;
		default : // case 5:
			$R = $V;
			$G = $p;
			$B = $q;
			break;
	}
	return array (
		$R,
		$G,
		$B
	);
}

$size = 30;
$width = $size * $strnum +10;
$height = $size +10;
$degrees = array ();
for ($i = 0; $i < $strnum; ++ $i) {
	$degrees[$i] = rand(0, 35);
} // 生成数字旋转角度

for ($i = 0; $i < $strnum; ++ $i) {
	if (rand() % 2);
	else
		$degrees[$i] = - $degrees[$i];
}

$image = imagecreatetruecolor($size, $size); // 数字图片画布
$validatepic = imagecreatetruecolor($width, $height); // 最终验证码画布
$back = imagecolorallocate($image, 255, 255, 255); // 背景色
$border = imagecolorallocate($image, 0, 0, 0); // 边框
imagefilledrectangle($validatepic, 0, 0, $width, $height, $back); // 画出背景色

// 数字颜色
for ($i = 0; $i < $strnum; ++ $i) {
	// 考虑为使字符容易看清使用颜色较暗的颜色
	$temp = RgbToHsv(rand(0, 255), rand(0, 255), rand(0, 255));

	if ($temp[2] > 60)
		$temp[2] = 60;

	$temp = HsvToRgb($temp[0], $temp[1], $temp[2]);
	$textcolor[$i] = imagecolorallocate($image, $temp[0], $temp[1], $temp[2]);
}

for ($i = 0; $i < $disturbpiontnum && $disturbpiont; ++ $i) //加入干扰象素
	{
	$randpixelcolor = ImageColorallocate($validatepic, rand(0, 255), rand(0, 255), rand(0, 255));
	imagesetpixel($validatepic, rand(1, $width -1), rand(1, $height -1), $randpixelcolor);
}

// 干扰线使用颜色较明亮的颜色
$temp = RgbToHsv(rand(0, 255), rand(0, 255), rand(0, 255));

if ($temp[2] < 200)
	$temp[2] = 255;

$temp = HsvToRgb($temp[0], $temp[1], $temp[2]);
$randlinecolor = imagecolorallocate($image, $temp[0], $temp[1], $temp[2]);

// 画干扰线
for ($i = 0; $i < $disturblinenum && $disturbline; $i++)
	imageline($validatepic, rand(1, 239), rand(1, 39), rand(1, 239), rand(1, 39), $randpixelcolor);

for ($i = 0; $i < $strnum; ++ $i) {
	$image = imagecreatetruecolor($size, $size); // 刷新画板
	imagefilledrectangle($image, 0, 0, $size, $size, $back); // 画出背景色 
	imagefttext($image, 13, 0, 5, 20, $textcolor[$i], $font_file, $randStr[$i]);
	$image = imagerotate($image, $degrees[$i], $back);
	imagecolortransparent($image, $back);
	imagecopymerge($validatepic, $image, 5 + 30 * $i, 5, 0, 0, imagesx($image), imagesy($image), 100);
}
imagerectangle($validatepic, 0, 0, $width -1, $height -1, $border); // 画出边框

header('Content-type: image/png');
imagepng($validatepic);
imagedestroy($validatepic);
imagedestroy($image);
$_SESSION['code'] = $validate;//将验证码存入session,如果实际应用,请md5.
?>

 字体文件和该文件放在同一目录下即可,如果不是请设置

$font_file

需要设置背景颜色请修改

$back = imagecolorallocate($image, 255, 255, 255); // 背景色

显示图框的大小会随着设置显示的字符数变化。使用起来还是比较方便的。

 

分享到:
评论
1 楼 xieye 2008-12-25  
以下内容节选自《PHP Web2.0开发实战》 老外写国人译的书

可以使用PEAR(PHP扩展与应用库)提供的Text_CAPTCHA组件来生成CAPTCHA图象。

先安装:可以下载,也可用pear命令
pear install Text_Password
pear install -f Text_CAPTCHA
pear install -f Image_Text

这个包依赖于另外两个,我试了一下,主要是生成随机的字符用的
还需要一个字体文件,后缀是ttf,网上很多,

            // 以下是createImage.php
            include(Text_CAPTCHA文件); //如果include路径已指向pear目录,可以没有这句话
            $captcha = Text_CAPTCHA::factory('Image'); //生成对象先
            //以下依次是大小,字库文件的路径,字库文件名
            $opts = array('font_size' => 20, 
                          'font_path' => Zend_Registry::get('config')->paths->data,
                          'font_file' => 'VeraBd.ttf');
            $phare = 自定义一个随机数;
            $captcha->init(120, 60, $phrase, $opts); //120和60是生成图片的宽和高
            //这里我选择png图片,随意,也可用jpg
            header('Content-type: image/png');
            echo $captcha->getCAPTCHAAsPng();



            //以下是test.html
            <img src="createImage.php">


是不是很简单?


相关推荐

    答复: PHP验证框

    【标题】"PHP验证框"涉及的是在PHP中实现用户输入数据验证的技巧。在Web开发中,确保用户提交的数据安全、有效是至关重要的。PHP作为服务器端脚本语言,可以处理并验证用户通过HTML表单提交的数据。下面将详细讨论...

    Jquery验证框架

    3. **valid.php**:此文件可能是用于服务器端验证的PHP脚本。它接收前端发送的数据,并根据预定义的规则进行验证。如果数据有效,服务器会返回成功消息;否则,会返回错误信息。 4. **说明.txt**:这个文本文件提供...

    jsvalidation 强大而灵活的表单客户端验证框架

    在应用服务器或者开发框架不提供验证的情况下,例如,普通的JSP, ASP, PHP等开发,以及一些不提供验证支持的开发框架,如Tapestry, Velocity等,JSValidation提供了一种灵活的解决方案。与其他验证方式相比,它最大...

    form验证与动态验证框架

    2. **后端验证**:后端验证主要由服务器负责,例如在PHP、Java、Python等服务器端语言中实现。框架如Spring Boot的Data Binding和Validation API提供了便捷的验证机制。后端验证确保即使前端被绕过,服务器也能保护...

    php+ajax表单无刷新验证

    **PHP + AJAX 表单无刷新验证** 在Web开发中,提供用户友好的表单验证是提高用户体验的关键因素。传统的表单验证方式通常在用户提交表单后进行,如果数据不符合要求,用户需要重新填写整个表单,这显然是不理想的。...

    一款基于PHP开发的网络验证系统源码.zip

    这款名为"quan-auth-erkai-main"的压缩包文件包含了一款基于PHP开发的网络验证系统的源代码。网络验证系统是任何在线服务中至关重要的部分,它负责确保只有合法的用户能够访问和交互。让我们深入探讨一下这个系统...

    validation-framwork 验证框架

    - **跨平台兼容性**:不论是在ASP、JSP、PHP还是其他脚本语言中,`Validation-Framework`都能够很好地运行。 - **易于集成**:只需要几行代码就可以轻松地将验证功能添加到现有的项目中。 - **灵活性**:支持多种...

    基于jquery的表单验证框架

    url: "check_username.php", data: {username: username}, type: "POST", success: function(result) { if (result === "taken") { // 显示用户名已存在错误 } else { // 用户名可用 } } }); }); ``` ##...

    php值得推荐的数据验证的类.zip

    在PHP开发中,数据验证是不可或缺的一环,它确保了输入数据的准确性和安全性,防止了潜在的SQL注入、跨站脚本攻击等安全问题。本压缩包“php值得推荐的数据验证的类”提供了一些优秀的PHP类库,帮助开发者轻松实现...

    一款php验证输入是否合法示例

    在PHP编程中,验证用户输入是一项至关重要的任务,它能够确保数据的安全性和应用程序的稳定性。在本示例中,我们将探讨如何使用PHP来检查输入是否合法,并在输入不合法时提供用户友好的反馈,例如使用红色框框进行...

    jquery-validate前台验证框架,带详细使用方法

    这里,`check-username.php`是处理验证请求的服务器端脚本。 8. **禁用/启用验证** 有时可能需要临时禁用或启用验证,可以使用`disable`和`enable`方法: ```javascript $("#myForm").validate().disable(); /...

    源码_happenn1i_html验证卡密_卡密系统_验证系统_卡密验证_

    【源码_happenn1i_html验证卡密_卡密系统_验证系统_卡密验证_】这个项目是一个基于PHP的卡密管理与验证系统,主要用于实现在线产品的激活功能。这个系统的核心在于生成和验证卡密,使得用户可以通过输入有效的卡密来...

    Opauth一个多provider的身份验证PHP框架

    Opauth:一个多provider的身份验证PHP框架

    php邮箱验证

    ThinkPHP是一个流行的PHP框架,它提供了丰富的工具和方法来简化开发过程,包括邮箱验证。本篇文章将深入探讨如何在ThinkPHP框架中实现邮箱验证,以及涉及到的核心知识点。 首先,我们需要了解的是PHPMailer库,这是...

    框架验证validation

    后端验证通常在服务器端进行,语言可以是PHP、Java、Python等,确保接收到的数据符合预期标准。 3. **CSS样式文件**:`style.css`和`style_min.css`是样式表文件,它们用于定义页面元素的外观。`style_min.css`通常...

    YII框架数据验证规则

    YII框架作为一款高效、安全且专业的PHP Web开发框架,提供了丰富的数据验证机制。本文将详细介绍YII框架中的数据验证规则,包括常用的验证器、验证规则的应用场景以及如何处理验证错误。 #### 二、YII框架数据验证...

    jsvalidation客户端JavaScript验证框架使用手册.doc

    - 当现有开发工具或框架未提供内置验证支持时,如Velocity、ASP、PHP、纯JSP或CGI。 - 当系统较大,表单验证需求复杂时,JSValidation可以显著减轻编程负担。 - 但若系统较小,验证需求简单,考虑到性能...

    使用php验证复选框有效性的示例

    本篇文章将深入探讨如何使用PHP验证复选框的有效性。 首先,我们来看一个简单的HTML复选框示例: ```html &lt;input type='checkbox' name='subscribe' value='yes'/&gt; 订阅我们的新闻简报 ``` 这个HTML代码创建了一...

    RespectValidate有史以来最了不起的PHP验证引擎

    **Respect Validate:PHP验证引擎详解** 在PHP开发过程中,数据验证是不可或缺的一环,它确保了输入数据的准确性和安全性。"Respect Validate"就是这样一款强大的PHP验证库,被誉为有史以来最了不起的PHP验证引擎。...

    jquery-validate验证框架使用详解及JS文件

    《jQuery Validate验证框架详解与JS应用》 在Web开发中,表单验证是不可或缺的一环,它确保用户输入的数据符合预设的规则,避免无效数据的提交,提高用户体验。jQuery Validate是一个强大的验证插件,它简化了...

Global site tag (gtag.js) - Google Analytics