`
hudeyong926
  • 浏览: 2015877 次
  • 来自: 武汉
社区版块
存档分类
最新评论

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

PHP 
阅读更多

验证码开发过程中的 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 random($type, $length = 16) {
    $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
    $rulemap_num = "123456789";
    $string = '';
    for ($i = 0; $i < $length; $i++) {
        switch ($type) {
            case 'ENGLISH':
                $rand = mt_rand(0, (strlen($rulemap_str) - 1));
                $string .= $rulemap_str[$rand];
                break;
            case 'CHINESE':
                $str[$i] = chr(mt_rand(176, 215)) . chr(mt_rand(161, 249));
                $str[$i] = iconv("GB2312", "UTF-8", $str[$i]); //imagettftext是utf-8的,所以先转换下
                $string .= $str[$i];
                break;
            case 'NUM':
                $rand = mt_rand(0, (strlen($rulemap_num) - 1));
                $string .= $rulemap_num[$rand];
                break;
            case 'FULL':
                $fullstr = $rulemap_str . $rulemap_num;
                $rand = mt_rand(0, (strlen($fullstr) - 1));
                $string .= $fullstr[$rand];
                break;
        }
    }
    return $string;
}

//建立验证图片
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 = random('english', 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="看不清?请刷新" width="50" height="20" onclick="this.src=this.src+'?'+Math.random()" />

第二种则是用JavaScript的方法:

<img src="validimg.jsp" width="50" height="20" > <a href="JavaScript:reloadImage("validimg.jsp" );">刷新</a>
<script language="JavaScript">
function reloadImage(url){
document.formName.img1.src = url+Math.random();
}
</script>

 

 

 

 
  • caption_chengmo.zip (64.6 KB)
  • 描述: 文字旋转,倾斜,黏贴,加正弦干扰线
  • 下载次数: 43
分享到:
评论

相关推荐

    优优云验证码识别答题平台PHPAPI接口第二版【2013/9/8】

    1、请检查您的php是否支持php curl 本api基于此与服务器通信,如果不支持将无法使用 2、在uuapi.php同目录下建立一个可读可写的目录,名称为tempimg 样例下载及详细说明页面:...

    会动的多帧Gif验证码 v1.0.zip

    会动的多帧Gif验证码用PHP製作的. 验证码图片由PHP生成的多帧构成,所以验证码是一个真实存在的可以动的gif图 使用方法非常简单   說明: Gif验证码 作者: 7di.net QQ群:223494678 验证: IF(!isSet($_...

    红鸟验证码 1.0.rar

    让验证码易识别!因为我们相信,复杂的验证码不仅阻止不了非自然人,反而让自然人无从下手! 红鸟验证码,从透明度着手,将两张图片,使用不同的透明度叠加,增加机器对颜色辨别的难度! 随意加载外部字体,...

    红鸟验证码 v1.0.zip

    让验证码易识别!因为我们相信,复杂的验证码不仅阻止不了非自然人,反而让自然人无从下手! 红鸟验证码,从透明度着手,将两张图片,使用不同的透明度叠加,增加机器对颜色辨别的难度! 随意加载外部字体,验证码...

    PHP实现生成带背景的图形验证码功能

    以前我们利用php生成的都是无背景或同一色彩背景的验证码了,但这种验证容易给机器识别了,这里就来介绍一些生成带背景的图形验证码实例. 1、产生一张png的图片, 2、为图片设置背景色, 3、设置字体颜色和样式, 4、产生...

    红鸟验证码 v1.0

    让验证码易识别!因为我们相信,复杂的验证码不仅阻止不了非自然人,反而让自然人无从下手!红鸟验证码,从透明度着手,将两张图片,使用不同的透明度叠加,增加机器对颜色辨别的难度!随意加载外部字体,验证码展示...

    PHP注册登录

    (4) 对一些资源的保护(通过session来实现),在未登录的情况下不能显示,资源可以是以前设计的静态页面网站,注意新设计的页面要与这些要保护的资源页面在风格上的一致性。 总体内容包括页面设计、前端和后台的...

    84PHP开源框架-PHP

    调整Vcode模块Base方法,使其返回验证码文本;修复了Wrong模块对AJAX请求识别错误的问题;新增用以缓存数据的Data模块;修复Setting模块中Set方法出错的问题;修复Page模块返回统计信息不准确问题;移除模板文件起始...

    JAVA上百实例源码以及开源项目

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    JAVA上百实例源码以及开源项目源代码

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java开源包1

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包11

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包2

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包3

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包6

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包5

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包10

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包4

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包8

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

Global site tag (gtag.js) - Google Analytics