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

比较全面的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
分享到:
评论

相关推荐

    php识别验证码完整例子

    在PHP中实现验证码识别是一个涉及图像处理、随机数生成以及字符串比较等技术的过程。验证码的主要目的是为了防止自动化脚本或机器人进行恶意操作,比如防止批量注册、刷票等。在这个"php识别验证码完整例子"中,我们...

    php防雅虎验证码/防QQ官方验证码

    当用户提交表单时,服务器端会比较输入的验证码与存储的值,如果匹配则验证通过,否则提示用户重新输入。 9. **优化性能**:为了提高用户体验,验证码的生成速度和图像质量都需要考虑。优化图像压缩,减少加载时间...

    php识别验证码完整例子 php56版本

    在本文中,我们将深入探讨如何在PHP 5.6环境下实现一个完整的验证码识别系统。验证码是一种常用的安全机制,用于防止自动机器人或恶意脚本进行非法操作,如批量注册、垃圾邮件发送等。PHP 5.6是较早的PHP版本之一,...

    好用的php验证码类库.zip

    类库通常会提供一个`store()`方法将验证码保存在session中,以便后续比较。 4. **验证用户输入**:当用户输入验证码后,`validate()`方法会检查用户输入是否与服务器端存储的验证码匹配,若匹配则返回true,否则...

    php验证码类 php中文验证码

    6. **验证过程**:当用户输入验证码后,服务器会比较`$_SESSION`中的验证码值与用户输入值是否一致,如果不一致则返回错误信息,否则视为验证成功。 7. **安全实践**:为了防止跨站请求伪造(CSRF)攻击,验证码应...

    php.zip_PHP验证码识别

    3. **比较值**:服务器端获取用户输入的验证码值,与存储在会话中的验证码值进行比较。 4. **验证结果**:如果两者匹配,验证成功;否则,提示用户重新输入。 验证码识别还涉及到自动化识别,通常称为OCR(光学字符...

    php验证码简单源码

    使用这个验证码源码时,你需要在HTML表单中添加一个图像标签来显示验证码,并且在提交表单时,通过POST方式将用户输入的验证码值与服务器端的`$_SESSION['captcha']`值进行比较。如果两者匹配,验证通过;如果不匹配...

    PHP验证验证码识别是否是人机

    5. **用户输入验证**:当用户提交验证码时,需要将他们输入的值与session中保存的验证码进行比较。如果匹配,说明验证成功;否则,验证失败。 6. **验证码刷新**:为了提高用户体验,通常会在验证码输入框旁边提供...

    漂亮的php 验证码

    4. 验证输入:比较用户输入的验证码与会话中存储的验证码是否一致。 5. 处理结果:如果验证通过,允许执行后续操作;否则,返回错误提示。 总的来说,这个“漂亮的php 验证码”项目展示了如何用PHP创建一个功能齐全...

    PHP动态验证码三个案例【数字字母,图片,汉字】

    图片验证码通过在图像上显示随机字符,增加了破解的难度,因为机器识别图像上的文本比识别纯文本更困难。实现时,可以使用GD库或Imagick库,这两个都是PHP的图形处理扩展。首先创建一个空白图像,然后在图像上随机...

    php源码 验证码 类

    在PHP中,验证码类的创建通常涉及到图像处理、随机数生成、字符串混淆以及客户端与服务器端的数据验证等多个方面。本篇文章将深入探讨PHP验证码类的相关知识。 首先,PHP验证码类的实现通常包括以下几个关键部分: ...

    php验证码,php验证码类

    4. **会话管理**:生成的验证码字符串应存储在服务器端的会话(session)中,以便稍后与用户的输入进行比较。使用`session_start()`开启会话,`$_SESSION['captcha']`保存验证码值。 5. **验证过程**:当用户提交...

    PHP实现的验证码类库

    4. **颜色与透明度**:为了使验证码更加难以自动识别,我们可以使用不同的颜色和透明度来绘制文本和背景元素。GD库支持设置颜色和透明度,通过随机选择颜色可以增加验证码的复杂性。 5. **session管理**:为了验证...

    php注册与登录(输入验证码)

    这些元素通过`name`属性来标识,以便PHP能够识别并处理它们。 3. 验证码技术: 验证码是防止自动化机器人或恶意攻击者自动提交表单的一种方法。在这个项目中,PHP可能生成一个随机字符串作为验证码,并显示在图像...

    php破解验证码配套代码

    开发者可能使用了GD库的函数如imagestring()来绘制随机字符,imagegif()或imagepng()来输出图像到浏览器,以及session变量来存储生成的验证码值,以便后续验证。 "picturecode.gif"是验证码的图像文件,可能由上述...

    简单完整的PHP验证码

    用户提交表单时,服务器会比较用户输入的验证码与保存在会话中的验证码是否一致,如果不一致则返回错误提示。 6. **提高安全性**: - 验证码长度:可以调整验证码的长度,增加破解的难度。 - 过期时间:设置...

    PHP超强验证码-合集

    - 保存和验证:将验证码保存到session,并在用户提交时对比输入值与session中的值。 - 安全性优化:防止SQL注入、XSS攻击,定期更换验证码字体和样式以防止被破解。 这个“PHP超强验证码-合集”提供的示例代码和...

    一款比较好用的php验证码类:kcaptcha

    5. **易于集成**:kcaptcha提供了一套简单的API,开发者可以通过调用函数生成验证码并验证用户输入,与现有的PHP应用集成起来十分方便。 6. **跨平台兼容**:kcaptcha是基于PHP开发的,因此可以在所有支持PHP的...

    PHP验证码封装类

    可以使用session或cookie来保存验证码值,然后在用户提交表单时进行比对。 这个“PHP验证码封装类”很可能包含了以上所有这些功能,并通过良好的封装使得开发者只需要调用几个方法就可以生成并验证验证码。类的结构...

    PHP实现生成验证码的代码

    - 使用 `strcmp` 函数比较用户提交的验证码与存储在会话中的验证码。 - 如果匹配,则输出“成功登录!”;如果不匹配,则输出“验证码输入错误!”。 #### 五、`testidentifyingcode.html` 分析 1. **表单设计**: ...

Global site tag (gtag.js) - Google Analytics