原生态字模生成变形错位的图片验证码

hudie631489527 hudie631489527 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一年又过去了,在这最后回家之前留下最后的手印
原本是为了破解12306.cn的验证码,经过一翻奋斗,还是只处于研究状态,一直没有下手,时间不多,烦心的事多,所以静不下来弄.(来年了,就着手这个了,为了来年能够用自己的程序买到火车票)
机原巧合,在破解图片的时候,想到自己之前写的图片验证码真是弱爆了,所以现在从不容易被人破解的角度重新写了此程序:
主要功能
1.生成字模(在生成字符串字模后,就不需要字体文件)
2.图片中字符旋转和交错
代码在此:(欢迎大家一起来讨论研究更好的实现方法)
原文地址: http://www.onlypo.com/archives/139

<?php
/****
* @auth: Buty
* @data: 2012-1-12
* @Func: 生成随机变形的验证码
* 准备工作:
1.创建字模数组 $captcha = new Captcha;
$captcha->createZiMo();
生成验证码:
$captcha->displayCaptcha();
*/
class Captcha {
private $words = '123456789ABCDEFGHIJKLNPQRSTUVXYZ';
private $width = 25; //字模宽度
private $height = 25; //字模高度
private $img;
private $text_color; //文字颜色
public $zimo_dir = 'zimopics/'; //字模生成文件目录
private $suffix = '.jpg'; //字模图片
public $zimo_file = 'zimo.php'; //字模数组文件
private $zimo = NULL;
private $font_file = 'arial.ttf';//ttf字体文件, 生成字模图片时必须的,在系统中随便找一个
//初始化画布
public function Captcha() {
$width = 120;
$height = 50;
if(!extension_loaded('gd')) { //需要gd扩展的支持
exit('GD extension is supported,please load GD extension and go on.');
}
$this->img = imagecreatetruecolor($width, $height);
$this->text_color = imagecolorallocate($this->img, 0, 0, 255);
$bg_color = imagecolorallocate($this->img, 255, 255, 255);
ImageFilledRectangle($this->img, 0, 0, $width, $height, $bg_color);
}
//保存验证码到session, 对于不同存储验证码的手段,此方法直接重写
function saveCode($code) {
session_start();
$_SESSION['code'] = implode('',$code);
setcookie('code', $_SESSION['code']);
}
//产生验证码
private function productNum($len) {
$num = array();
$total_len = strlen($this->words);
for($i = 0; $i < $len; $i++) {
$index = mt_rand(0, ($total_len - 1));
$num[]= $this->words[$index];
}
return $num;
}
//显示验证码
function displayCaptcha($len = 4) {
if(empty($len)) $len = 4;
$code = $this->productNum($len);
foreach($code as $k => $v) {
$this->addZiMo($v, $k * $this->width);
}
//保存验证码到session
$this->saveCode($code);
//输出图片
$this->showNewPic();
}
//添加新字模到图片
function addZiMo($str, $width=0) {
if(!$this->zimo) {
$this->loadZiMo();
}
$str = strtoupper($str);
if(isset($this->zimo[$str])) {
$this->rotateZiMo($this->zimo[$str],$width);
}
}
//加载字模数据
function loadZiMo() {
if(is_file($this->zimo_dir . $this->zimo_file)) {
$this->zimo = include $this->zimo_dir . $this->zimo_file;
//解析字模点阵
$this->zimo = $this->strToArray($this->zimo);
} else {
exit('Zimo file not exists, please use method `createZiMo` create Zimo file.');
}
}
//旋转字模打点
function rotateZiMo($data, $width=0) {
$angle = $this->randAngle(); //角度随机
$width = $this->randDistance($width);//距离随机

foreach($data as $i => $v) {
foreach($v as $j => $vs) {
if(!$vs) {
$jindex = $j+$width;
$res = $this->circleCoord($width,0,$jindex,-$i, $angle);
$new_i = floor(abs($res['y']));
$new_j = floor(abs($res['x']));
imagesetpixel($this->img, $new_j, $new_i, $this->text_color);
}
}
}
return $data;
}
//角度变换
function randAngle() {
return mt_rand(-15,15); //角度随机
}
//距离变换
function randDistance($width) {
return $width + mt_rand(15,20); //距离随机
}
//根据圆心坐标,圆上一点坐标,角度,计算另一坐标
function circleCoord($x0,$y0,$x1,$y1,$angle) {
$r = sqrt(($x1 - $x0)*($x1 - $x0) + ($y1 - $y0)*($y1 - $y0));
$arc = ($x1 - $x0) / $r;
$angle0_rad = acos($arc);
$angle0_rad = rad2deg($angle0_rad);
$angle_new = $angle0_rad + $angle;
$new_x = $x0 + $r * cos(deg2rad($angle_new));
$new_y = $y0 + $r * sin(deg2rad($angle_new));
return array('x' => $new_x, 'y' => $new_y);
}

/*****************************************自行创建字模图片与字模数组文件********************************/
//创建字模图片
function createZiMoPic($words = '') {
if(!file_exists($this->font_file)) { //字体需要存在
exit('Font file no exists.');
}
$this->checkDoc(); //如果目录不存在,自动生成
if(empty($words)) $words = $this->words;
for($i = 0; $i < strlen($words); $i++) {
$num = $words[$i];
$height = 25; //高度
$width = 25; //一个字符宽度
$font_size = 25; //字体大小
$font = $this->font_file; //ttf字体
$x = 0;
$y = 0;
$angle = 0;
$img = imagecreatetruecolor($width, $height);
$text_color = imagecolorallocate($img, 0, 0, 255);
$bg_color = imagecolorallocate($img, 255, 255, 255);
//其左上角坐标为 x,y
ImageFilledRectangle($img, $x, $y, $width, $height, $bg_color);
//由 x,y 所表示的坐标定义了第一个字符的基本点(大概是字符的左下角)
imagettftext($img, $font_size, $angle, $x, $height, $text_color, $font, $num);
ImageJPEG($img, $this->zimo_dir . strtoupper($num) . $this->suffix);
imagedestroy($img);
}
}
//检测目录是否存在,不存在创建
function checkDoc() {
if(!is_dir($this->zimo_dir)) {
mkdir($this->zimo_dir,0777,true);
}
}
//创建字模
function createZiMo($words = '') {
if(empty($words)) $words = $this->words;
$this->createZiMoPic($words);
$data = array();
if(is_dir($this->zimo_dir)) {
if($dp = opendir($this->zimo_dir)) {
while (($file = readdir($dp)) !== false) {
if($file != '.' && $file != '..' && $this->suffix == strrchr($file, '.')) {
$key = substr($file, 0, -strlen($this->suffix));
$value = $this->createZiMoDot($this->zimo_dir . $file);
$data[$key] = $value;
}
}
closedir($dp);
}
}
$data = $this->arrayToStr($data);
$this->writeZiMoFile($data);
}
//写入字模文件
function writeZiMoFile($data) {
$fp = fopen($this->zimo_dir . $this->zimo_file, 'w');
$data = $this->stripWhiteEnter(var_export($data, true));
fwrite($fp, "<?php\r\nreturn ".$data."\r\n?>");
fclose($fp);
}
//将三维数组改写成字符串
function arrayToStr($data) {
foreach($data as $k => $v) {
$str = '';
foreach($v as $sk => $sv) {
foreach($sv as $ssk => $ssv) {
$str .= $ssv;
}
}
unset($data[$k]);
$data[$k] = $str;
}
return $data;
}
//将一维数组按规律改写成三维数组
function strToArray($data) {
$cut_words = 25; //将字符串切成25个小数组
foreach($data as $k => $v) {
unset($data[$k]);
$strlens = strlen($v);
for($i = 0; $i < $strlens; $i++) {
$secindex = floor($i/$cut_words);
$data[$k][$secindex][] = $v[$i];
}
}

return $data;
}
// 去除代码中的空白和换行
function stripWhiteEnter($content) {
$stripword = array(' ','\t',"\r","\n","\r\n");
$content = str_replace($stripword,"",$content);
return $content;
}
//生成字模点阵
function createZiMoDot($picfile) {
$res = imagecreatefromjpeg($picfile);
$size = getimagesize($picfile);
$data = array();
for($i=0; $i < $size[1]; ++$i) {
for($j=0; $j < $size[0]; ++$j) {
$rgb = imagecolorat($res,$j,$i);
$rgbarray = imagecolorsforindex($res, $rgb);
if($rgbarray['red'] > 125 || $rgbarray['green']>125) {
$data[$i][$j]=1;
} else {
$data[$i][$j]=0;
}
}
}
return $data;
}
//显示生成的图片
function showNewPic() {
header('Content-type: image/jpeg');
ImageJPEG($this->img);
imagedestroy($this->img);
}
}

$captcha = new Captcha;
//$captcha->createZiMo();
$captcha->displayCaptcha();

验证码图片如下:

所在文件: http://www.onlypo.com/test/captcha/
查看demo: http://www.onlypo.com/test/captcha/captcha.php
...全文

相关推荐

Art2008CMS 7.0 GBK.rar

Art2008CMS是一款完全开源的程序,功能完善,覆盖面广、扩展性强、负载能力好、模板调用非常灵活、管理方便,因此不仅适合于建设一般企业、政府、学校、个人等小型网站,同时也适合于建设地方门户、行业门户等大中型网站。 Art2008CMS 7.0 GBK 更新内容:2012-11-20 1、新增模板样式管理自定义列表样式中产品系统的特定标签; 2、新增swfupload上传接口,完善系统上传功能,可实现可视化批量上传; 3、新增支付宝标准双接口,同时更新在线支付平台代码; 4、新增图文并茂标签2种Flash焦点图显示效果; 5、新增各个模型SEO优化选项,每篇文档都可以单独设置keywords及描述。 6、新增文章系统中内容过滤字符功能; 7、新增两种伪静态网站运行方式,1是带问号,2是需要组建; 8、新增会员管理中推荐功能; 9、新增会员注册时可选择用户组,后台可指定是否开放用户组会员注册; 10、新增自定义字段中可以添加上传文件类型的字段; 11、新增自定义SQL标签中可实现分列显示,可实现更多更复杂的显示效果; 12、修改所有标签实现动态XML数据存储,然后再读取,减少服务器运行压力,提高数据访问速度; 13、修改评论系统,评论页面整体修改,增加评论页面分页功能,管理员可回复评论功能; 14、修改留言板系统,新增会员留言功能,同时可对留言的权限进行管理; 15、修复后台及部分标签在火狐浏览器,GoogleChrome浏览器中显示错位问题; 16、修复首页自动更新功能; 17、修复专题页面在SQL数据库下出错问题; 18、修复文章上下条标签,相关文章标签,从js调用改成直接读取,有利于SEO; 19、修复后台栏目管理中点栏目进入文章列表时,无法显示内容bug; 20、新增内容系统栏目批量设置功能; 21、新增栏目模版为图片类型显示时,图片按比例缩放,原图不变形; 22、对部分代码及结构进行的调整;修复其他细节问题; 特色介绍: 支持函数标签   你可以轻松的建立,管理自己网站每一处的内容调用,你可以根据需要的效果给它指定你认为满意的参数。 简洁明了的网站后台   网站功能强大,并不意味着管理起来就会很麻烦。结构化的后台设计帮助您迅速上手运营。 强大完善的网站功能   我们有着多年的网站开发运营经验,而这些是保证我们的产品是能够适应用户的需求。 迅速的响应能力      利用asp平台,加入大量的优化,确保每一个页面都可以最快的响应用户指令。 超强的负载能力      每一个功能都加入大量的信息进行抗压测试,保证达到最大负载下的轻松应对! 开源的系统         完全开源的程序,都毫无保留的完全开放源代码,用户不需额外安装其他DLL组件。 开放的系统         提供开放的API接口,方便对主流的论坛及博客程序进行完美整合! 安全性高的系统      不论功能性能的开发上会有如何的捷径,我们只坚信,把安全摆在第一位才是最重要的! 灵活的模板系统      网站模板以文件形式保存在磁盘目录,直接修改,即时生效,灵活,方便,高效! 免费的系统         Art2008CMS Free是一款免费的网站管理系统。您也可以选择由强大的技术团队来为您提供及时高效的技术支持,以及为您专门订制属于您的特有功能! 后台管理初始用户名:admin 密码:admin  验证码:art2008 前台初始用户名:Art2008cms 密码:111111

weixin_39841882

TC8测试TCP-UNACCEPTABLE-04/006

TC8测试TCP-UNACCEPTABLE-04/006

车载中间件通信

PSIM-串联谐振半桥LLC开关电源+PFM变频闭环控制【仿真+计算书+参考文献】

内容概要:本文档系统性地整合了电力电子与控制系统仿真领域的丰富资源,聚焦于基于PSIM和Simulink平台的串联谐振半桥LLC开关电源建模与仿真,深入探讨PFM变频闭环控制策略的设计与实现。内容涵盖LLC谐振变换器的工作原理、关键参数设计、开环与闭环仿真模型构建、软开关技术(ZVS/ZCS)、恒压恒流双竞争控制机制以及调频控制等核心技术,配套提供完整的仿真文件、计算书和参考文献,有助于深入理解高频开关电源系统的动态响应特性与稳定性分析方法。此外,文档还汇集了大量拓展性仿真资源,涉及双向DC-DC变换器、PWM整流器、PFC电路、储能系统、微电网优化、DAB变换器、并网逆变器等多个方向,构成一套完整的科研与工程实践参考资料体系。; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校本科生、研究生,以及从事开关电源设计、新能源系统开发、电力变换器研发等工作的工程技术人员。; 使用场景及目标:①深入学习LLC谐振变换器的拓扑结构与闭环控制原理;②掌握PSIM/Simulink在电力电子系统中的高精度建模与仿真技能;③为科研项目、学位论文或产品开发提供可复用的技术方案与代码基础;④深化对PFM控制、软启动过程、ZVS/ZCS实现机制及系统稳定性的理解; 阅读建议:建议结合文档中提供的仿真模型与计算书进行同步操作,优先剖析主电路拓扑与控制逻辑架构,再逐步开展参数调节与仿真验证实验,同时可参考所列相关资源拓展技术视野,提升综合设计能力。

抬头望远方

【MATLAB例程,无人机避障7】基于RRT*与人工势场法(RRT*+APF)的多无人机二维动态路径规划与避障

程序采用快速扩展随机树星算法(RRT*)与人工势场法(APF),实现四架无人机在二维动态障碍环境中的路径规划与协同避碰。通过RRT*的邻域选父和节点重连优化全局参考路径,利用APF进行局部动态避障,绘制全局路径、实际轨迹、安全净间隙、速度与加速度及航程等图像,对比RRT+APF与RRT*+APF的规划效果。无人机起终点、障碍物分布、采样次数及运动约束均可自行调整。

MATLAB卡尔曼

Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查 - 配套实验资源

本资源是《Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查》的配套实验工具,适用于 Windows PowerShell 5.1 和 PowerShell 7,帮助开发者排查 Git、Node.js、Python、Codex 等工具的多版本共存、PATH 配置异常及命令优先级冲突问题。 **资源包含两个 PowerShell 脚本:** 1. **Get-ToolchainInventory.ps1**:只读环境诊断工具,可列出开发工具的命令候选路径,检查 PATH 目录、重复条目及无效路径。不执行开发工具,也不修改系统配置。 2. **Invoke-PathPrecedenceLab.ps1**:PATH 优先级演示工具,在系统临时目录中生成测试命令,通过临时调整当前进程的 PATH,直观展示 Windows 命令查找与优先级规则。实验结束后自动恢复 PATH 并清理自身创建的临时文件。 **资源特点:** - 兼容 Windows PowerShell 5.1 和 PowerShell 7。 - 支持开发工具路径盘点与 PATH 冲突分析。 - 提供可重复的命令优先级实验。 - 不修改注册表、系统级或用户级环境变量。 - 不卸载软件、不安装依赖、不执行包管理器。 - 适合 Windows 开发环境排查、PowerShell 学习与技术教学。 **使用说明:** 下载后建议先审查脚本,再按照配套文章中的 PowerShell 命令运行。脚本已完成静态检查与打包,尚未经过 Windows 实机执行验证。 **安全提示:** 诊断结果可能包含个人或组织目录信息,公开分享前请脱敏。若受到 PowerShell 执行策略限制,应采用符合环境安全要求的授权方式运行,不建议全局关闭安全限制。

flyingonpine
评论 11
收藏 已收藏
分享
返回顶部
hudie631489527
PHP 20,393 成员 19,654 内容