01.5.6稍作修改,验证码文字旋转,使用不同字体,可加干扰码、可加干扰线、可使用中文、可使用背景图片
新附件为:Captcha.zip
验证码要让人看清楚,又要让机器难识别。
两个都要兼顾比较好的做法是:加随机背景图片、随机字体、稍微旋转字母或数字,位置不固定,稍微扭曲。(字体要用容易识别的,背景要人容易识别文字有对机器识别干扰大)
下策:添加干扰字符、干扰线。简单点的对机器识别影响不大,复杂点的对人眼识别影响过大。
用gif验证码,先来一段预先播放再显示验证码安全是非常高的。
验证码使用了20种字体,要下载上传的附件下来才能测试,不能直接copy代码就debug。
在我的512内存的破Windows机上跑起来,生成一个验证码花的时间在0.0086619853973389-0.00999xxxx之间,在vps上跑是0.00354886054993左右。我是在我的框架控制器中调用来测试的,如果直接测试,速度会更快些。我觉得性能还可以,我测试的代码是:
public function getAction() {
$start = microtime(1);
YL_Security_Secoder::entry();
file_put_contents(dirname(__FILE__) . '/test.php', (microtime(1)-$start));
}
给我评评看,这安全度和用户识别麻烦度各有多大呢?
这用php写的代码我自己都觉得有点晕,如果用py或rb写的,可读性该好很多,只是精通了php以后让我再学习用ry/py来做,难度有点大。
<?php
/**
* 安全验证码
*
* 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码。
* 如果用中文做验证码(我这里不是哦,有兴趣你来改成用中文的),安全度会更好些,但验证码扭曲和旋转是王道,用了字体也算是已经给字体扭曲了,我就不再去给他添一只扭曲的足了。
* 可配置的属性都是一些简单直观的变量,我就不用弄一堆的setter/getter了
*
* @author 流水孟春 <cmpan(at)qq.com>
* @copyright NEW BSD
* @link http://labs.yulans.cn/YL_Security_Secoder
* @link http://wiki.yulans.cn/docs/yl/security/secoder
*/
class YL_Security_Secoder {
/**
* 验证码的session的下标
*
* @var string
*/
public static $seKey = 'sid.sekey.ylans.cn';
public static $expire = 3000; // 验证码过期时间(s)
/**
* 验证码中使用的字符,01IO容易混淆,建议不用
*
* @var string
*/
public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
public static $fontSize = 25; // 验证码字体大小(px)
public static $useCurve = true; // 是否画混淆曲线
public static $useNoise = true; // 是否添加杂点
public static $imageH = 0; // 验证码图片宽
public static $imageL = 0; // 验证码图片长
public static $length = 4; // 验证码位数
public static $bg = array(243, 251, 254); // 背景
protected static $_image = null; // 验证码图片实例
protected static $_color = null; // 验证码字体颜色
/**
* 输出验证码并把验证码的值保存的session中
* 验证码保存到session的格式为: $_SESSION[self::$seKey] = array('code' => '验证码值', 'time' => '验证码创建时间');
*/
public static function entry() {
// 图片宽(px)
self::$imageL || self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5;
// 图片高(px)
self::$imageH || self::$imageH = self::$fontSize * 2;
// 建立一幅 self::$imageL x self::$imageH 的图像
self::$_image = imagecreate(self::$imageL, self::$imageH);
// 设置背景
imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]);
// 验证码字体随机颜色
self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));
// 验证码使用随机字体
$ttf = dirname(__FILE__) . '/ttfs/' . mt_rand(1, 20) . '.ttf';
if (self::$useNoise) {
// 绘杂点
self::_writeNoise();
}
if (self::$useCurve) {
// 绘干扰线
self::_writeCurve();
}
// 绘验证码
$code = array(); // 验证码
$codeNX = 0; // 验证码第N个字符的左边距
for ($i = 0; $i<self::$length; $i++) {
$code[$i] = self::$codeSet[mt_rand(0, 27)];
$codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.6);
// 写一个验证码字符
imagettftext(self::$_image, self::$fontSize, mt_rand(-40, 70), $codeNX, self::$fontSize*1.5, self::$_color, $ttf, $code[$i]);
}
// 保存验证码
isset($_SESSION) || session_start();
$_SESSION[self::$seKey]['code'] = join('', $code); // 把校验码保存到session
$_SESSION[self::$seKey]['time'] = time(); // 验证码创建时间
header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header("content-type: image/png");
// 输出图像
imagepng(self::$_image);
imagedestroy(self::$_image);
}
/**
* 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数)
*
* 高中的数学公式咋都忘了涅,写出来
* 正弦型函数解析式:y=Asin(ωx+φ)+b
* 各常数值对函数图像的影响:
* A:决定峰值(即纵向拉伸压缩的倍数)
* b:表示波形在Y轴的位置关系或纵向移动距离(上加下减)
* φ:决定波形与X轴位置关系或横向移动距离(左加右减)
* ω:决定周期(最小正周期T=2π/∣ω∣)
*
*/
protected static function _writeCurve() {
$A = mt_rand(1, self::$imageH/2); // 振幅
$b = mt_rand(-self::$imageH/4, self::$imageH/4); // Y轴方向偏移量
$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量
$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期
$w = (2* M_PI)/$T;
$px1 = 0; // 曲线横坐标起始位置
$px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667); // 曲线横坐标结束位置
for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {
if ($w!=0) {
$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b
$i = (int) ((self::$fontSize - 6)/4);
while ($i > 0) {
imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 这里画像素点比imagettftext和imagestring性能要好很多
$i--;
}
}
}
$A = mt_rand(1, self::$imageH/2); // 振幅
$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量
$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期
$w = (2* M_PI)/$T;
$b = $py - $A * sin($w*$px + $f) - self::$imageH/2;
$px1 = $px2;
$px2 = self::$imageL;
for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {
if ($w!=0) {
$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b
$i = (int) ((self::$fontSize - 8)/4);
while ($i > 0) {
imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多
$i--;
}
}
}
}
/**
* 画杂点
* 往图片上写不同颜色的字母或数字
*/
protected static function _writeNoise() {
for($i = 0; $i < 10; $i++){
//杂点颜色
$noiseColor = imagecolorallocate(
self::$_image,
mt_rand(150,225),
mt_rand(150,225),
mt_rand(150,225)
);
for($j = 0; $j < 5; $j++) {
// 绘杂点
imagestring(
self::$_image,
5,
mt_rand(-10, self::$imageL),
mt_rand(-10, self::$imageH),
self::$codeSet[mt_rand(0, 27)], // 杂点文本为随机的字母或数字
$noiseColor
);
}
}
}
/**
* 验证验证码是否正确
*
* @param string $code 用户验证码
* @return bool 用户验证码是否正确
*/
public static function check($code) {
isset($_SESSION) || session_start();
// 验证码不能为空
if(empty($code) || empty($_SESSION[self::$seKey])) {
return false;
}
// session 过期
if(time() - $_SESSION[self::$seKey]['time'] > self::$expire) {
unset($_SESSION[self::$seKey]);
return false;
}
if($code == $_SESSION[self::$seKey]['code']) {
return true;
}
return false;
}
}
// useage
/*
YL_Security_Secoder::$useNoise = false; // 要更安全的话改成true
YL_Security_Secoder::$useCurve = true;
YL_Security_Secoder::entry();
*/
/*
// 验证验证码
if (!YL_Security_Secoder::check(@$_POST['secode'])) {
print 'error secode';
}
*/
大张的图不清楚,就再加些直接保存下来的验证码吧。有兴趣多刷几张图看看的话,刷这里http://www.yulans.cn/dp/secode/get 别把我的vps刷死就行
- 大小: 46 KB
- 大小: 34.9 KB
- 大小: 1.5 KB
- 大小: 1.6 KB
- 大小: 1.5 KB
- 大小: 1.8 KB
- 大小: 1.7 KB
- 大小: 1.8 KB
分享到:
相关推荐
验证码是一种常见的网络安全机制,用于防止自动化程序(如机器人)对网站进行恶意操作,例如批量注册、垃圾评论等。在Web开发中,ASP.NET提供了一种强大的工具来创建自定义的验证码,而`aspx.cs`文件是ASP.NET Web ...
验证码(CAPTCHA)是“全自动区分计算机和人类的图灵测试”的缩写,它是一种用于防止恶意自动化程序(如机器人)滥用网站服务的安全机制。在PHP中,验证码通常通过生成随机字符串并配合图像处理库来创建,使得人类...
这是一个简单易懂,好看的验证码。希望大家能够喜欢,谢谢!
在这个特定的“好看的验证码”项目中,我们可以期待一个设计精美、易于人类辨识同时对机器有挑战性的验证码。 在C#中实现验证码,我们通常会用到以下技术: 1. **图形编程**:使用GDI+库来创建和操作图像。这包括...
验证码(CAPTCHA)是一种用于验证用户是否为人类的在线安全技术。它的全称是“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。验证码通常...
文件主要有html构成,安全的实现了验证码的验证。
验证码安全总结
这是个 自己写的 可以改样式 的非常漂亮 美观的验证码
总之,这个验证码解决方案为JAVA和.NET开发者提供了一种视觉上吸引人且安全的工具,有助于保护Web应用程序免受自动化攻击。无论是在ASP.NET的Web Forms项目,还是JAVA的JSP应用中,都可以方便地集成和自定义,以满足...
多彩的PHP验证码生成类,简单方面使用。 $_vc = new ValidateCode(); //实例化一个对象 $_vc->doimg(); session('yzm_session',$_vc->getCode());//验证码保存到SESSION中
验证码是Web应用中常用的一种安全机制,用于防止自动机器人或者恶意攻击者进行非法操作,例如批量注册、恶意登录等。本篇文章将详细讲解基于PHP实现的高安全验证码生成类,以及如何利用字体库来增强其安全性。 ...
5. **安全考虑**:为了增强安全性,验证码应该有时间限制,过期后无效。此外,每次请求新的验证码时,旧的验证码应被立即废弃。还可以使用CSRF令牌来防止跨站请求伪造攻击。 6. **优化用户体验**:题目中的“超漂亮...
在网络安全领域,验证码(CAPTCHA)...通过深入研究和实践,我们可以了解到如何利用MATLAB和机器学习技术来解决网络安全中的验证码识别问题,这对于提升网络安全防护能力,以及深化对机器学习的理解都有着重要的价值。
验证码是Web应用中常见的一种安全机制,用于防止自动机器人或恶意脚本进行非法操作,如批量注册、垃圾评论等。在PHP中实现验证码功能,我们可以使用自定义的类或者现有的库来生成和验证验证码。本篇文章将围绕标题...
结合Ajax技术和中文验证码,我们可以创建一个既高效又安全的验证流程,既减少了页面刷新带来的用户体验损失,也提升了系统的安全性。在实际应用中,还可以根据需求考虑增加其他功能,如定时更换验证码、点击刷新...
在VB(Visual Basic)编程环境下实现登录QQ空间和安全中心并处理验证码是一项涉及网络通信、网页交互以及图像处理的技术任务。下面将详细讲解这个过程涉及的主要知识点。 首先,要实现登录功能,我们需要理解HTTP...
在移动应用开发中,尤其是Android平台,用户注册过程中的手机验证码验证是一个常见的安全措施,用于确保用户提供的手机号码是有效的并归用户所有。这个过程通常涉及到短信服务提供商(如Mob)以及应用程序接口(API...
在网络安全领域,登录验证码是一种广泛使用的安全机制,用于防止恶意自动化程序(如机器人)未经授权地访问或操作用户账户。本文将深入探讨“gif动态登录验证码”这一特定的技术,以及它如何增强网站的安全性。 ...
获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是...
验证码是网络应用中常见的一种安全机制,用于防止自动化的机器人或者恶意用户进行非法操作,比如批量注册、恶意登录等。在“验证码 注册验证 验证码验证”的场景下,我们主要关注的是如何在用户注册过程中,通过...