比较全面的php session验证码与防分辨

php中文网
发布: 2016-06-13 13:04:47
原创
1156人浏览过

比较全面的php session验证码与防识别

验证码开发过程中的 3 个误区:

1、? 背景干扰:干扰线、干扰点、干扰图,基本没有,程序很容易通过高亮度调节去除掉。

2、? 字符旋转:破解机器人通过数次学习、旋转之后,能够得到 90% 以上的正确识别率,采用常规字体,能够得到接近 100% 的识别。

3、? 随机间距:基本没用,采用提取高亮度之后,采用图片切割的方法,很容易就将随机间距消灭掉。

?

防止被破解:

1、? 背景干扰线尽量能够干扰到字符,采用和字符相同的颜色,能够破坏高亮度反差色提取法对字符的学习。 QQ 有采用。

2、? 矢量变形:想 Google Ms Yahoo 都采用了这种变态的方法,这种将字符进行扭曲变形,基本上机器识别率为零,因为没有相对应的固定形状。 损失是用户也不一定认得。需要验证码图片有一些大才行。

3、? 字符粘连,可以破坏掉字符切割法分割字符, Google 也有用到这个, QQ 也有采用。

4、? 中文验证码,中文验证码的识别难度比较大,但是现在逐渐的也慢慢被学习并且破解。(香港,台湾是用繁体)

5、? 字符旋转:需要和字符粘连在一起才能够起作用,他们一起,验证码几乎不具备机器破解可能性。 加随机背景图片、随机字体、稍微旋转字母或数字,位置不固定,稍微扭曲

?

注意:

字体.ttf的当$mode=7的该字体必须支持中文,否则出现乱码。

在服务端做验证时取session存储的验证字符与用户提交的字符进行比较,相同则通过验证。

<?php
/*
* @Date 2011-2-24
* @Author hudeyong926
*/
function getCode($length = 32, $mode = 0) {
	switch ($mode) {
		case '1' :
			$str = '123456789';
			break;
		case '2' :
			$str = 'abcdefghijklmnopqrstuvwxyz';
			break;
		case '3' :
			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
			break;
		case '4' :
			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
			break;
		case '5' :
			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
			break;
		case '6' :
			$str = 'abcdefghijklmnopqrstuvwxyz1234567890';
			break;
		case '7' ://中文验证码
			break;
		default :
			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
			break;
	}
	$result = '';

	for($i = 0; $i < $length; $i ++) {
		if ($mode == 7) {
			$str [$i] = chr ( mt_rand ( 176, 215 ) ) . chr ( mt_rand ( 161, 249 ) );
			$str [$i] = iconv ( "GB2312", "UTF-8", $str [$i] ); //imagettftext是utf-8的,所以先转换下
			$result .= $str [$i];
		} else {
			$l = strlen ( $str ) - 1;
			$num = mt_rand ( 0, $l );
			$result .= $str [$num];
		}
	}
	return $result;
}

//建立验证图片
function createAuthNumImg($randStr, $fontName, $imgW = 100, $imgH = 40) {
	header ( "content-type: image/png" );
	$image = imagecreate ( $imgW, $imgH );
	$fontSize = 20;//字号
	//$green = imagecolorallocate($image,0x6b,0xc1,0x46);
	$gray = imagecolorallocate ( $image, 228, 228, 228 ); //灰色
	$red  = imagecolorallocate ( $image, 255, 102, 204 );//粉色 
	$blue = imagecolorallocate($image,0x53,0x68,0xbd);
	$colors = array($red, $gray, $blue);
	
	$color_b = imagecolorallocate ( $image, 0, 0, 0 ); //黑色
	for($i = 0; $i < 1000; $i ++) { //绘背景干扰点
		imagesetpixel ( $image, mt_rand ( 0, $imgW ), mt_rand ( 0, $imgH ), $colors[rand(0,count($colors)-1)]);
	}
	imagerectangle ( $image, 0, 0, $imgW - 1, $imgH - 1, $color_b );//绘制边框
	imagettftext ( $image, $fontSize, 5, 3, 25, $color_b, $fontName, $randStr);///将验证字符绘入图片 字符旋转	
	for($i=0; $i<2; $i++){ //绘背景干扰线
		imageline($image, mt_rand(0,5), mt_rand(6,18), mt_rand(65,$imgW), mt_rand(6,$imgH), $color_b);//一条干扰线
	}	
	imagepng ( $image );
	imagedestroy ( $image );
}

session_start ();
$verifyCode = GetCode ( 5 );
$_SESSION ['VERIFY_CODE'] = $verifyCode ;
createAuthNumImg ( $verifyCode, "font.ttf", 75, 30); //字体存放路径,如果你没有文件就去C:\WINDOWS\Fonts文件中找一个吧。

/** 问答模式
$a=GetCode(2,1);  
$b=GetCode(1,1);  
$passPort = $a."+".$b."=?";  
$verifyCode = $a+$b;  

$_SESSION ['VERIFY_CODE'] = $verifyCode ;  
createAuthNumImg ( $passPort, "font.ttf", 75, 30);
*/
?>
登录后复制

中文占两个字符长度,需要控制验证码图片的长度,一个中文位置相当于2个非中文

<?php echo strlen('中'); echo strlen('ad');?>
登录后复制

为了避免机器人的破解,验证码的视觉效果越来越差,随之很多网站就加了“看不清?请刷新”之类的功能,当然也不是简简单单的页面刷新,是只刷新验证码部分,用户从而得到一个新的验证码。在网上看了些别人写的方法,下面总结两种。
第一种比较简单,运用一下onclick即可,直接点击验证码的图片就可以刷新,不过最好在验证码后面说明一下,提示有这个功能。

<img src="validimg.jsp" alt="看不清?请刷新"    style="max-width:90%"  style="max-width:90%" onclick="this.src=this.src+'?'+Math.random()" />
登录后复制

第二种则是用JavaScript的方法:

<img  src="validimg.jsp"    style="max-width:90%"  style="max-width:90%"  alt=" 比较全面的php session验证码与防分辨 " > <a href="JavaScript:reloadImage("validimg.jsp" );">刷新</a>
<script language="JavaScript">
function reloadImage(url){
document.formName.img1.src = url+Math.random();
}
</script>
登录后复制
?

?

Tellers AI
Tellers AI

Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

Tellers AI 78
查看详情 Tellers AI

?

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号