From 6017e221432095b6c2472d5c2d031f196bd2086a Mon Sep 17 00:00:00 2001 From: cm Date: Thu, 14 Nov 2019 15:12:35 +0800 Subject: [PATCH] v 1.0 --- README.md | 172 ++++---------- assets/example-1.png | Bin 740 -> 0 bytes assets/example-2.jpg | Bin 2065 -> 0 bytes assets/{gd_simple/code.ttf => font.ttf} | Bin assets/gd_simple/bgs/1.jpg | Bin 30428 -> 0 bytes assets/gd_simple/bgs/2.jpg | Bin 29677 -> 0 bytes assets/gd_simple/bgs/3.jpg | Bin 32109 -> 0 bytes assets/gd_simple/bgs/4.jpg | Bin 29081 -> 0 bytes assets/gd_simple/bgs/5.jpg | Bin 27940 -> 0 bytes assets/gd_simple/bgs/6.jpg | Bin 31381 -> 0 bytes assets/gd_simple/bgs/7.jpg | Bin 30234 -> 0 bytes assets/gd_simple/bgs/8.jpg | Bin 30188 -> 0 bytes assets/ttfs/1.ttf | Bin 49548 -> 0 bytes composer.json | 8 +- lib/Captcha.php | 301 ++++++++++++++++++++++++ lib/CaptchaInterface.php | 35 +-- lib/Code.php | 99 -------- lib/Exception.php | 22 -- lib/adapter/GD.php | 229 ------------------ lib/adapter/GDSimple.php | 155 ------------ test/test.php | 20 ++ test/testGD.php | 14 -- test/testGDSimple.php | 14 -- 23 files changed, 383 insertions(+), 686 deletions(-) delete mode 100644 assets/example-1.png delete mode 100644 assets/example-2.jpg rename assets/{gd_simple/code.ttf => font.ttf} (100%) delete mode 100644 assets/gd_simple/bgs/1.jpg delete mode 100644 assets/gd_simple/bgs/2.jpg delete mode 100644 assets/gd_simple/bgs/3.jpg delete mode 100644 assets/gd_simple/bgs/4.jpg delete mode 100644 assets/gd_simple/bgs/5.jpg delete mode 100644 assets/gd_simple/bgs/6.jpg delete mode 100644 assets/gd_simple/bgs/7.jpg delete mode 100644 assets/gd_simple/bgs/8.jpg delete mode 100644 assets/ttfs/1.ttf create mode 100644 lib/Captcha.php delete mode 100644 lib/Code.php delete mode 100644 lib/Exception.php delete mode 100644 lib/adapter/GD.php delete mode 100644 lib/adapter/GDSimple.php create mode 100644 test/test.php delete mode 100644 test/testGD.php delete mode 100644 test/testGDSimple.php diff --git a/README.md b/README.md index 26ef46f..58d800a 100644 --- a/README.md +++ b/README.md @@ -1,132 +1,40 @@ -验证码组件 -============= -安全可靠的验证码,拥有很强的反机器识别能力,同时又不失人眼阅读体验。 - -## require - - php 5.5+ - - GD2 - -## 安装 -该组件已包含在Windwork框架中,如果你已安装Windwork框架则可以直接使用。 - -- 安装方式一:通过composer安装(推荐) -``` -composer require windwork/wf -``` - -- 安装方式二:传统方式安装 -[下载源码](https://github.com/windwork/wf/releases)后,解压源码到项目文件夹中,然后require_once $PATH_TO_WF/core/lib/Loader.php文件,即可自动加载组件中的类。 - -## 使用示例 -1、生成验证码图片 -``` -$cfg = [ - 'gradient' => 32, // 文字倾斜度范围 - 'fontSize' => 30, // 验证码字体大小(px) - 'length' => 4, // 验证码位数 - 'distortLevel' => 0,// 验证码扭曲级别(0-9),0为不扭曲,如果启用,建议为验证码字体大小/6 -]; - -$capt = new \wf\captcha\adapter\GDSimple($cfg); -$secId = 'login'; -$capt->render($secId); - -``` - -2、验证码对比校验 -``` -// 验证码id与生产验证码的id一致 -$secId = 'login'; -if (!\wf\captcha\Code::check(@$_POST['secode'], $secId)) { - print 'error secode'; -} -``` - -## 效果预览 - -- 普通效果 - -![效果图](assets/example-1.png) - -- 高级效果 - -![效果图](assets/example-2.jpg) - - - -## 配置选项 - -``` -// 在 config/app.php 设置验证码组件参数 - -// GDSimple(推荐使用) -return [ - 'srv' => [ - 'captcha' => [ - 'class' => '\wf\captcha\adapter\GDSimple', - 'gradient' => 32, // 文字倾斜度范围 - 'fontSize' => 30, // 验证码字体大小(px) - 'length' => 4, // 验证码位数 - 'distortLevel' => 0,// 验证码扭曲级别(0-9),0为不扭曲,如果启用,建议为验证码字体大小/6 - // 验证码中使用的字符,01IO容易混淆,建议不用 - 'codeSet' => '356789ABCDEFGHKLMNPQRSTUVWXY', - 'expire' => 3000, - ] - ] -]; - - -// GDSafety -return [ - 'srv' => [ - 'captcha' => [ - 'class' => '\wf\captcha\adapter\GDSafety', - 'expire' => 3000, // 验证码过期时间(s) - 'gradient' => 20, // 文字倾斜度范围 - 'length' => 4, // 验证码位数 - ] - ] -]; - - -// GD -return [ - 'srv' => [ - 'captcha' => [ - 'class' => '\wf\captcha\adapter\GD', - 'expire' => 3000, // 验证码过期时间(s) - 'useBgImg' => false, // 是否使用背景图片 - 'useCurve' => false, // 是否画混淆曲线 - 'useNoise' => true, // 是否添加杂点 - 'gradient' => 22, // 文字倾斜度范围 - 'fontSize' => 30, // 验证码字体大小(px) - 'height' => 0, // 验证码图片高,0为根据fontSize自动计算 - 'width' => 0, // 验证码图片宽,0为根据fontSize自动计算 - 'length' => 4, // 验证码位数 - 'distortLevel' => 5, // 验证码扭曲级别(0-9),0为不扭曲,如果启用,建议为验证码字体大小/6 - - // 验证码背景颜色 - 'bg' => [243, 251, 254], - - // 验证码选择使用的字体列表,字体放在 ./assets/ttfs/ 文件夹 - 'ttfs' => ['1.ttf'], - - // 验证码选择使用的背景图片列表,图片放在 ./assets/bgs/ 文件夹 - 'bgs' => ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg'], - - ] - ] -]; - -// 创建实例 -$capt = wfCaptcha(); // new {$cfg['srv']['captcha']['class']}($cfg['srv']['captcha']) - -``` - - -
-
- -### 要了解更多? -> - [官方完整文档首页](http://docs.windwork.org/manual/) -> - [官方源码首页](https://github.com/windwork) +验证码组件 +============= +安全可靠的验证码,拥有很强的反机器识别能力,同时又不失人眼阅读体验。 + +## require + - php 5.5+ + - GD2 + +## 安装 +该组件已包含在Windwork框架中,如果你已安装Windwork框架则可以直接使用。 + +- 安装方式一:通过composer安装(推荐) +``` +composer require windwork/captcha +``` + +## 使用示例 + +``` + false, // 是否使用背景图片 + 'useNoise' => false, // 是否添加干扰字符 + 'curve' => 1, // 画混淆曲线数量 + 'distort' => 0, // 扭曲级别(0-9),0为不扭曲,建议为验证码字体大小/8 + 'length' => 4, // 验证码位数 + 'fontSize' => 36, // 验证码字体大小(px) +]); + +// set to session +session_start(); +$_SESSION['phrase'] = $capt->getPhrase(); + +$capt->output(90); + +``` + diff --git a/assets/example-1.png b/assets/example-1.png deleted file mode 100644 index 2651adfd95be101ab3033a33464f70737e67d8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmV zS{K{;w#ljM)0XmQqrLYq^fyQ*dlKc27KlK4^h~A7e3bs%9Z>DxinK zi@tjESS_gl00J;cL_t(YiOrSmdfOljg^{sK0g;4sOPsFjW^ea@jnxM*r?&e%TmMWy zoEV#zqa%ThX<@D9i~08$hQ*DNKEvC>^*#US^?$pq9$YRFgw3Lmb2 z$GgLshX+^32p3`o$REv)ALAau%UE!NGbR9}cLbNq3Jys>x_ulWP{zO+2XGsPBgg`O z-Uxs}H3ddRgrtb&wS*HzjEnsLnf{W1ni17ynx}e)x(+Eg?BSB8HXOj1i`d2m`PTQ+ zG~I|k)>4zJu3(?nAXD_qJHzqR_lhHpCw{`bab}^)bIk-&$)pV$J%R&2NhnG~bROVb zaB&vtio;fN)NHqKGSrg+%7RQXx4Dy@K^?j)RvM++;K9N$q5a2iUarc^(Q45)-J~s+F)wA5 z9CPcJWyn4x9G#7+P9k2%pQ7kjCnzULyqs}cn|xsyw+w5`2REjz13m>rI|o{q diff --git a/assets/example-2.jpg b/assets/example-2.jpg deleted file mode 100644 index 73e69c40bd0aa06b84dffdae173f63a78fc86e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmV+s2=4cZP)cN(VYI=y#B_0 z{+FDdTV7vzeSfyRzSP^^9v>e(K0hTVCmI_Y4-XF(7Z*=bQ=b$5z-|7b8~&aT{mc>b5e{&}$eJd6HYo&FDR{vvw*fdV5V000L_NklU5hz~$G^XaK~sd`x8EZ~_J-w7eT2p8w!r;C;AnZ!!cDIs^n0vIXK> zD}Mu$5w2V-;P%S8ZzpxElqtO5vcz%QSG*rCHA`UpwY3?FWg zg*LzQIv`x+K64LrtEAHhtO%NC63Ku^Arn;tqRT zc3pd&D!hk0@odj#i41(3Dcaz@NC08-VL*al`{0kYdq8~h%(awP2qZ+$R5`L4M%*fZ zFtu}a*f&M(W9&vFI$dsnKrW16>zONoaEaN#MNpDQmBI;MQ-5zX;%FW476@koo;6%bo=Hs0b~t=fj0jOZg)_?p)4DJ8OQtt(S6 zove*RRf2*V2oe$`oc?LflCzdv7`Xi<9g#+NgUA$E?6-!**PDC5_R}aVN&xMGLL9EQ zDg5|=7igVDlf79%$cY2a=8HEk6>ojNc+u;K&&c6$2t*$B^6`l*WPP0JIArB2v|qx7 z!wx&_u)_}fg{&Xm@ zionC-!QM+-K{y*D&lm_id4}uBIHeNF9LF;)u2+t1oTf2er1pU!VQt%$WoQ0Ynk~S}f%7IBKXs& zwoZ~;HTbh?4g(;Ezb@CA0|L-YUaW$*yf*A<9SUxG);^yF(O1?qbq#Fz1Il=*vm0NTp38_(QA$JqhPPWg1GRw_Cdyc9^f6R^ChrXZYt3)*Ffw*uY?&vDVQ0jFmA(m|I z0?GZWMKaWyN{fh-si4BArBaH7H}?TOly#`Z@RpC{4u$%^4K=w)cD0U{YDq}%R9}Q) zUOM7JsS=V)=Wzw}O66m=A{nmNF_!HS;@e@}y2JPZrh*a5H&32OC=#u7-1gRW-WJuK}cm3YLeQqmCskM;r-qYd~h9=fjoHkPKbN6H#iDgu_kgmhJXiB}I4mL%G&f8zD4kVwciQKv>0;VXr@k%4W6+p9%r0GKkGHVqN zMY1<9r%93OW$LE-K5KcF@q-!I&9v6X%QT5frkLK5-1`yjD(~_Ue$obc+Pc@*Pf41r zzx8})WPAr3u(MzL&E2NDmvCg-0{d6HtL<#|DQvnf%e?-lSgl^%Kesh+ddvTrt$WMA v!hUM2-~R8$!wx&_u)_{J?6AWQ`!(!;QG0UpRoyvP00000NkvXXu0mjfAocNz diff --git a/assets/gd_simple/code.ttf b/assets/font.ttf similarity index 100% rename from assets/gd_simple/code.ttf rename to assets/font.ttf diff --git a/assets/gd_simple/bgs/1.jpg b/assets/gd_simple/bgs/1.jpg deleted file mode 100644 index d417136bb4613984dd88ac25590d2794344c990f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30428 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 diff --git a/assets/gd_simple/bgs/2.jpg b/assets/gd_simple/bgs/2.jpg deleted file mode 100644 index 56640bde4ed9a02c4e46b951f2108e5e4814b14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29677 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 diff --git a/assets/gd_simple/bgs/3.jpg b/assets/gd_simple/bgs/3.jpg deleted file mode 100644 index 83e5bd9026f9d46c96738a4209f1abb91f7e1e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32109 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 WW2Q1p-X6|ip1UGwC*Qp@{Qm&B(nP5M diff --git a/assets/gd_simple/bgs/4.jpg b/assets/gd_simple/bgs/4.jpg deleted file mode 100644 index 97a3721bc777a569c6665e38dec04a82df9176da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29081 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�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
5eqK))^(a`g}#Vel}`0jqQ{$m(#9bM;B`pV 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%0Dja6n-|cc61%dSLS`lUd7W-JGp5n>o88 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૦ilU=I8^3w$Rh1aryLRN1@vEe`O?@pzT+nv6 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 R;s=GvM3(ZxPL-v5{|~;{ne6}o diff --git a/assets/gd_simple/bgs/8.jpg b/assets/gd_simple/bgs/8.jpg deleted file mode 100644 index e10cf28115e47d1f5413e76efeccc39cd655b6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30188 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 diff --git a/assets/ttfs/1.ttf b/assets/ttfs/1.ttf deleted file mode 100644 index f4bf513638123a8f37f7e996c3ef12cec9e8c370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49548 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�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
Gq#gB}sEP=d#qdgO}oOyf3ay8E2pPj$*T=Y$U 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 F{{R}Bi!cBH diff --git a/composer.json b/composer.json index 0c72a5f..b97bc81 100644 --- a/composer.json +++ b/composer.json @@ -5,10 +5,10 @@ "captcha", "anti robot" ], - "version" : "0.7.0", - "time" : "2017-06-26 16:10:00", + "version" : "1.0.0", + "time" : "2019-11-14 13:00:00", "require" : { - "php" : ">=5.5.0", + "php" : ">=5.5", "ext-gd" : "*" }, "license" : "MIT", @@ -23,4 +23,4 @@ "homepage" : "http://windwork.org" } ] -} \ No newline at end of file +} diff --git a/lib/Captcha.php b/lib/Captcha.php new file mode 100644 index 0000000..75a9e12 --- /dev/null +++ b/lib/Captcha.php @@ -0,0 +1,301 @@ +entry(); + * + * 验证码对比校验 + * if (!\wf\captcha\Code::check(@$_POST['secode'], $id)) { + * print 'error secode'; + * } + * + * @package wf.captcha.adapter + * @author cmm + * @link http://docs.windwork.org/manual/wf.captcha.html + * @since 1.0.0 + */ +class Captcha implements CaptchaInterface +{ + private $cfg = [ + 'useBgImg' => false, // 是否使用背景图片 + 'useNoise' => false, // 是否添加干扰字符 + 'curve' => 1, // 画混淆曲线数量 + 'distort' => 0, // 扭曲级别(0-9),0为不扭曲,建议为验证码字体大小/6 + 'length' => 4, // 验证码位数 + 'fontSize' => 36, // 验证码字体大小(px) + ]; + + /** + * 验证码图片宽度(px,根据验证码字数自动计算) + * @var int + */ + protected $width; + + + /** + * 验证码图片高度(px,根据验证码字数自动计算) + * @var int + */ + protected $height; + + /** + * 验证码中使用的字符,01IO容易混淆,建议不用 + * + * @var string + */ + private $phraseSet = '356789ABCDEFGHKLMNPQRSTUVWXY'; + + /** + * 验证码图片实例 + * @var function imagecreate + */ + private $image = null; + + /** + * 验证码字体颜色 + * @var function imagecolorallocate + */ + private $color = null; + + private $phrase = ''; + + public function __construct(array $cfg = []) + { + $this->cfg = array_replace_recursive($this->cfg, $cfg); + + // 图片宽(px) + $this->width = $this->cfg['length'] * $this->cfg['fontSize']*0.9; + + // 图片高(px) + $this->height = $this->cfg['fontSize'] * 1.36; + + $this->build(); + } + + public function getPhrase() + { + return $this->phrase; + } + + public function output($quality = 90) + { + 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/jpeg"); + + // 输出验证码图像 + imagejpeg($this->image, null, $quality); + imagedestroy($this->image); + } + + public function get($quality = 90) + { + ob_start(); + + imagejpeg($this->image, null, $quality); + imagedestroy($this->image); + + return ob_get_clean(); + } + + protected function build($id = 'sec') + { + + if ($this->cfg['useBgImg']) { + // 使用图片背景 + // 建立一幅 $this->width x $this->height 的图像 + $this->image = imagecreatetruecolor($this->width, $this->height); + + $this->bgImg(); + } else { + // 使用纯色背景 + // 建立一幅 $this->width x $this->height 的图像 + $this->image = imagecreate($this->width, $this->height); + + imagecolorallocate($this->image, mt_rand(120, 255), mt_rand(120, 255), mt_rand(120, 255)); + + if ($this->cfg['useNoise']) { + $this->noise(); // 绘杂点 + } + } + + // 验证码字体随机颜色 + $this->color = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100)); + + + for ($i = 0; $i < $this->cfg['curve']; $i++) { + $this->curve(); // 绘干扰线 + } + + $this->phrase(); + + if ($this->cfg['distort']) { + $this->distort(); // 扭曲验证码 + } + } + + /** + * 绘制验证码字符 + */ + protected function phrase() + { + // 验证码使用随机字体 + $ttf = dirname(__DIR__) . '/assets/font.ttf'; + + // 绘验证码 + $phrase = []; + + $phraseNX = - $this->cfg['fontSize'] * 0.2; // 验证码第N个字符的左边距 + + for ($i = 0; $i<$this->cfg['length']; $i++) { + $phrase[$i] = $this->phraseSet[mt_rand(0, strlen($this->phraseSet)-1)]; + if ($i > 0 && in_array($phrase[$i-1], ['M', 'W'])) { + // 最宽的 MW + $phraseNX += $this->cfg['fontSize']*0.9; + } elseif ($i > 0 && in_array($phrase[$i-1], ['B', 'G', 'H', 'N'])) { + // 较宽易混淆的字符 + $phraseNX += $this->cfg['fontSize']*0.8; + } elseif ($i > 0 && (is_numeric($phrase[$i-1]) + || in_array($phrase[$i-1], [6, 7, 9, 'A', 'C', 'F', 'L', 'P', 'T', 'V']))) { + // 不易混淆的字符 679ACFLPTV + $phraseNX += $this->cfg['fontSize']*0.7; + } else { + $phraseNX += $this->cfg['fontSize']*0.6; + } + + // 倾斜度 + $gradient = mt_rand(-20, 20); + + // 绘制一个验证码字符 + imagettftext($this->image, $this->cfg['fontSize'], $gradient, $phraseNX, $this->cfg['fontSize']*1.1, $this->color, $ttf, $phrase[$i]); + } + + + $this->phrase = implode('', $phrase); + } + + + /** + * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数) + * + * 高中的数学公式咋都忘了涅,写出来 + * 正弦型函数解析式:y=Asin(ωx+φ)+b + * 各常数值对函数图像的影响: + * A:决定峰值(即纵向拉伸压缩的倍数) + * b:表示波形在Y轴的位置关系或纵向移动距离(上加下减) + * φ:决定波形与X轴位置关系或横向移动距离(左加右减) + * ω:决定周期(最小正周期T=2π/∣ω∣) + * + * (^_^)看到这里如果觉得有盗版嫌疑,可以搜索一下十多年前的代码,看看到底是谁盗版谁 + */ + protected function curve() + { + $px = $py = 0; + + $A = mt_rand(- $this->height / 2, $this->height / 2); // 振幅 + $b = mt_rand(- $this->height / 4, $this->height / 4); // Y轴方向偏移量 + $f = mt_rand(- $this->width / 4, $this->width / 4); // X轴方向偏移量 + $T = mt_rand($this->width / 2, $this->width); // 周期 + $w = (2* M_PI)/$T; + + $px1 = mt_rand(0, $this->width/4); // 曲线横坐标起始位置 + $px2 = mt_rand($px1 + $this->width/3, $this->width); // 曲线横坐标结束位置 + + for ($px = $px1; $px <= $px2; $px ++) { + if ($w == 0) { + break; + } + + $py = $A * sin($w*$px + $f)+ $b + $this->height/2; // y = Asin(ωx+φ) + b + $i = max(2, intval($this->cfg['fontSize']/10)); + while ($i > 0) { + imagesetpixel($this->image, $px, $py + $i, $this->color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多 + $i--; + } + } + } + + /** + * 画杂点 + * 往图片上写不同颜色的字母或数字 + */ + protected function noise() + { + for($i = 0; $i < $this->cfg['fontSize']/4; $i++){ + //杂点颜色 + $noiseColor = imagecolorallocate($this->image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255)); + + for ($j = 0; $j < 4; $j++) { + // 绘杂点 + imagestring($this->image, 5, mt_rand(-10, $this->width), mt_rand(-10, $this->height), $this->phraseSet[mt_rand(0, 25)], $noiseColor); + } + } + } + + /** + * 绘制背景图片 + */ + protected function bgImg() + { + // 随机选择背景图片 + $imgId = mt_rand(1, 8); + $bgImgPath = dirname(__DIR__) . "/assets/bgs/{$imgId}.jpg"; + list($width, $height) = @getimagesize($bgImgPath); + + // 复制背景图片设置 + $bgImage = @imagecreatefromjpeg($bgImgPath); + $srcX = mt_rand(0, floor($width - $this->width)); + $srcY = mt_rand(0, floor($height - $this->height)); + + @imagecopy($this->image, $bgImage, 0, 0, $srcX, $srcY, $this->width, $this->height); + @imagedestroy($bgImage); + } + + + /** + * 水平扭曲验证码图片 + */ + protected function distort() + { + $level = $this->cfg['distort']; + + $rgb = []; + $direct = rand(0, 1); + $width = imagesx($this->image); + $height = imagesy($this->image); + + $offset = mt_rand(3, 8)/10; // 偏移量 + + for($y = 0; $y < $height; $y++) { + // 获取像素图点阵像素 + for($x = 0; $x < $width; $x++) { + $rgb[$x] = imagecolorat($this->image, $x , $y); + } + + // 使用正弦函数水平方向扭曲图片(修改像素点x轴偏移) + for($x = 0; $x < $width; $x++) { + $r = sin($y / $height * 2 * M_PI - M_PI * $offset) * ($direct ? $level : -$level); + imagesetpixel($this->image, $x + $r , $y , $rgb[$x]); + } + } + } +} + + + diff --git a/lib/CaptchaInterface.php b/lib/CaptchaInterface.php index b1d3410..3e9960a 100644 --- a/lib/CaptchaInterface.php +++ b/lib/CaptchaInterface.php @@ -7,32 +7,33 @@ * @copyright Copyright (c) 2008-2017 Windwork Team. (http://www.windwork.org) * @license http://opensource.org/licenses/MIT */ -namespace wf\captcha; +namespace wf\Captcha; /** - * 验证码接口 - * - * usage: - * $capt = wfCaptcha(); // - * $capt->render(); - * - * 验证码对比校验 - * if (!\wf\captcha\Code::check(@$_POST['secode'])) { - * print 'error secode'; - * } - * + * * @package wf.captcha * @author cm * @link http://docs.windwork.org/manual/wf.captcha.html - * @since 0.1.0 + * @since 1.0 */ interface CaptchaInterface { + public function getPhrase(); + + /** + * out put captcha image + * + * @param int $quality + * @return mixed + */ + public function output($quality = 90); + /** - * 生成验证码,输出为图片格式,并保存验证码字符到session - * - * @param string $id = 'sec' 验证码类别,如登录)login;注册)regster + * get image content + * + * @param int $quality + * @return mixed */ - public function render($id = 'sec'); + public function get($quality = 90); } diff --git a/lib/Code.php b/lib/Code.php deleted file mode 100644 index 70f3ddb..0000000 --- a/lib/Code.php +++ /dev/null @@ -1,99 +0,0 @@ - $secode['expire']) { - return false; - } - - if(strtoupper($code) == strtoupper($secode['code'])) { - return true; - } - - return false; - } - - /** - * 保存最新验证码信息 - * - * @param string $code 验证码字符串 - * @param int $expire 验证码过期时间戳 - * @param string $id = 'sec' - */ - public static function save($code, $expire, $id = 'sec') - { - $id || $id = 'sec'; - $id = preg_replace("/[^0-9a-z\\-_]/i", '', $id); - - isset($_SESSION) || session_start(); - - $_SESSION[self::SESS_KEY][$id]['code'] = $code; // 把校验码保存到session - $_SESSION[self::SESS_KEY][$id]['expire'] = $expire; // 验证码创建时间 - } - - /** - * 水平扭曲验证码图片 - * - * @param resource $img - * @param int $level 扭曲级别(0-9),0为不扭曲,建议为验证码字体大小/6 - */ - public static function distort($img, $level) - { - $rgb = []; - $direct = rand(0, 1); - $width = imagesx($img); - $height = imagesy($img); - $offset = mt_rand(3, 8)/10; // 偏移量 - - for($y = 0; $y < $height; $y++) { - // 获取像素图点阵像素 - for($x = 0; $x < $width; $x++) { - $rgb[$x] = imagecolorat($img, $x , $y); - } - // 使用正弦函数水平方向扭曲图片(修改像素点x轴偏移) - for($x = 0; $x < $width; $x++) { - $r = sin($y / $height * 2 * M_PI - M_PI * $offset) * ($direct ? $level : -$level); - imagesetpixel($img, $x + $r , $y , $rgb[$x]); - } - } - } -} \ No newline at end of file diff --git a/lib/Exception.php b/lib/Exception.php deleted file mode 100644 index 621a0c6..0000000 --- a/lib/Exception.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @since 0.1.0 - */ -class Exception extends \Exception -{ - -} \ No newline at end of file diff --git a/lib/adapter/GD.php b/lib/adapter/GD.php deleted file mode 100644 index 7aab581..0000000 --- a/lib/adapter/GD.php +++ /dev/null @@ -1,229 +0,0 @@ -entry(); - * - * 验证码对比校验 - * if (!\wf\captcha\Code::check(@$_POST['secode'], $id)) { - * print 'error secode'; - * } - * - * @package wf.captcha.adapter - * @author cmm - * @link http://docs.windwork.org/manual/wf.captcha.html - * @since 1.0.0 - */ -class GD implements \wf\captcha\CaptchaInterface -{ - private $cfg = [ - 'bg' => [255, 255, 255], // 验证码背景颜色 - 'expire' => 3000, // 验证码过期时间(s) - 'useBgImg' => false, // 是否使用背景图片 - 'useCurve' => false, // 是否画混淆曲线 - 'useNoise' => true, // 是否添加杂点 - 'gradient' => 22, // 文字倾斜度范围 - 'fontSize' => 16, // 验证码字体大小(px) - 'height' => 0, // 验证码图片高,0为根据fontSize自动计算 - 'width' => 0, // 验证码图片宽,0为根据fontSize自动计算 - 'length' => 4, // 验证码位数 - 'ttfs' => ['1.ttf'], // 验证码使用字体列表 - 'bgs' => ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg'], // 验证码使用背景图片列表 - ]; - - public function __construct(array $cfg = []) - { - $this->cfg = array_replace_recursive($this->cfg, $cfg); - } - - /** - * 验证码中使用的字符,01IO容易混淆,建议不用 - * - * @var string - */ - private $codeSet = '3456789AbcDEFHKLMNPQRSTUVWXY'; - - /** - * 验证码图片实例 - * @var function imagecreate - */ - private $image = null; - - /** - * 验证码字体颜色 - * @var function imagecolorallocate - */ - private $color = null; - - /** - * {@inheritDoc} - * @see \wf\captcha\CaptchaInterface::render() - */ - public function render($id = 'sec') - { - // 图片宽(px) - $this->cfg['width'] || $this->cfg['width'] = $this->cfg['length'] * $this->cfg['fontSize'] * 1.35; - - // 图片高(px) - $this->cfg['height'] || $this->cfg['height'] = $this->cfg['fontSize'] * 2; - - // 建立一幅 $this->cfg['width'] x $this->cfg['height'] 的图像 - $this->image = imagecreate($this->cfg['width'], $this->cfg['height']); - - // 设置背景 - imagecolorallocate($this->image, $this->cfg['bg'][0], $this->cfg['bg'][1], $this->cfg['bg'][2]); - - // 验证码字体随机颜色 - $this->color = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100)); - - // 验证码使用随机字体 - $ttf = dirname(dirname(__DIR__)) . '/assets/ttfs/' . $this->cfg['ttfs'][array_rand($this->cfg['ttfs'])]; - - // 绘制干扰信息 - if($this->cfg['useBgImg']) { - $this->background(); // 添加背景图片 - } elseif ($this->cfg['useNoise']) { - $this->writeNoise(); // 绘杂点 - } - $this->cfg['useCurve'] && $this->writeCurve(); // 绘干扰线 - - // 绘验证码 - $code = []; // 验证码 - $codeNX = - mt_rand($this->cfg['fontSize']*0.3, $this->cfg['fontSize']*0.6); // 验证码第N个字符的左边距 - for ($i = 0; $i<$this->cfg['length']; $i++) { - $code[$i] = $this->codeSet[mt_rand(0, strlen($this->codeSet)-1)]; - $codeNX += mt_rand($this->cfg['fontSize']*0.95, $this->cfg['fontSize']*1.1); - $gradient = mt_rand(-$this->cfg['gradient'], $this->cfg['gradient']); - - // 写一个验证码字符 - imagettftext($this->image, $this->cfg['fontSize'], $gradient, $codeNX, - mt_rand($this->cfg['fontSize']*1.25, $this->cfg['fontSize']*1.36), - $this->color, $ttf, $code[$i]); - } - - // 保存验证码 - \wf\captcha\Code::save(join('', $code), time() + $this->cfg['expire'], $id); - - 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($this->image); - imagedestroy($this->image); - } - - /** - * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数) - * - * 高中的数学公式咋都忘了涅,写出来 - * 正弦型函数解析式:y=Asin(ωx+φ)+b - * 各常数值对函数图像的影响: - * A:决定峰值(即纵向拉伸压缩的倍数) - * b:表示波形在Y轴的位置关系或纵向移动距离(上加下减) - * φ:决定波形与X轴位置关系或横向移动距离(左加右减) - * ω:决定周期(最小正周期T=2π/∣ω∣) - * - */ - protected function writeCurve() - { - $px = $py = 0; - - // 曲线前部分 - $A = mt_rand(1, $this->cfg['height']/2); // 振幅 - $b = mt_rand(-$this->cfg['height']/4, $this->cfg['height']/4); // Y轴方向偏移量 - $f = mt_rand(-$this->cfg['height']/4, $this->cfg['height']/4); // X轴方向偏移量 - $T = mt_rand($this->cfg['height'], $this->cfg['width']*2); // 周期 - $w = (2* M_PI)/$T; - - $px1 = 0; // 曲线横坐标起始位置 - $px2 = mt_rand($this->cfg['width']/2, $this->cfg['width'] * 0.8); // 曲线横坐标结束位置 - - for ($px = $px1; $px <= $px2; $px ++) { - if ($w == 0) { - break; - } - - $py = $A * sin($w*$px + $f)+ $b + $this->cfg['height']/2; // y = Asin(ωx+φ) + b - $i = (int) ($this->cfg['fontSize']/6); - while ($i > 0) { - imagesetpixel($this->image, $px, $py + $i, $this->color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多 - $i--; - } - } - - // 曲线后部分 - $A = mt_rand(1, $this->cfg['height']/2); // 振幅 - $f = mt_rand(-$this->cfg['height']/4, $this->cfg['height']/4); // X轴方向偏移量 - $T = mt_rand($this->cfg['height'], $this->cfg['width']*2); // 周期 - $w = (2* M_PI)/$T; - $b = $py - $A * sin($w*$px + $f) - $this->cfg['height']/2; - $px1 = $px2; - $px2 = $this->cfg['width']; - - for ($px = $px1; $px <= $px2; $px ++) { - if ($w == 0) { - break; - } - - $py = $A * sin($w*$px + $f)+ $b + $this->cfg['height']/2; // y = Asin(ωx+φ) + b - $i = (int) ($this->cfg['fontSize']/6); - while ($i > 0) { - imagesetpixel($this->image, $px, $py + $i, $this->color); - $i--; - } - } - } - - /** - * 画杂点 - * 往图片上写不同颜色的字母或数字 - */ - protected function writeNoise() - { - for($i = 0; $i < $this->cfg['fontSize']/4; $i++){ - //杂点颜色 - $noiseColor = imagecolorallocate($this->image, mt_rand(150, 255), mt_rand(150, 255), mt_rand(150, 255)); - - for ($j = 0; $j < 4; $j++) { - // 绘杂点 - imagestring($this->image, 5, mt_rand(-10, $this->cfg['width']), mt_rand(-10, $this->cfg['height']), $this->codeSet[mt_rand(0, 25)], $noiseColor); - } - } - } - - /** - * 绘制背景图片 - */ - private function background() - { - // 随机选择背景图片 - $bgImgPath = dirname(dirname(__DIR__)) . '/assets/bgs/' . $this->cfg['bgs'][array_rand($this->cfg['bgs'])]; - - list($width, $height) = @getimagesize($bgImgPath); - - // Resample - $bgImage = @imagecreatefromjpeg($bgImgPath); - @imagecopyresampled($this->image, $bgImage, 0, 0, 0, 0, $this->cfg['width'], $this->cfg['height'], $width, $height); - @imagedestroy($bgImage); - } -} - - - diff --git a/lib/adapter/GDSimple.php b/lib/adapter/GDSimple.php deleted file mode 100644 index 7237b10..0000000 --- a/lib/adapter/GDSimple.php +++ /dev/null @@ -1,155 +0,0 @@ -entry(); - * - * 验证码对比校验 - * if (!\wf\captcha\Captcha::check(@$_POST['secode'], $id)) { - * print 'error secode'; - * } - * - * @package wf.captcha.adapter - * @author cm - */ -class GDSimple implements \wf\captcha\CaptchaInterface -{ - private $cfg = [ - 'useBgImg' => 0, // 是否使用背景图片 - 'bgColor' => [255, 255, 255], // 验证码背景颜色,不使用背景图片时有效 - 'color' => [0x45, 0x45, 0x45], // 验证码背景颜色 - 'gradient' => 32, // 文字倾斜度范围 - 'fontSize' => 30, // 验证码字体大小(px) - 'length' => 4, // 验证码位数 - 'height' => 0, // 验证码图片高,0为根据fontSize自动计算 - 'width' => 0, // 验证码图片宽,0为根据fontSize自动计算 - 'distortLevel' => 0,// 验证码扭曲级别(0-9),0为不扭曲,如果启用,建议为验证码字体大小/6 - // 验证码中使用的字符,01IO容易混淆,建议不用 - 'codeSet' => '356789ABCDEFGHKLMNPQRSTUVWXY', - 'expire' => 3000, - ]; - - public function __construct(array $cfg = []) - { - $this->cfg = array_replace_recursive($this->cfg, $cfg); - } - - /** - * 验证码图片实例 - * @var function imagecreate - */ - private $image = null; - - /** - * 验证码字体颜色 - * @var function imagecolorallocate - */ - private $color = null; - - public function render($id = 'sec') - { - // 图片宽(px) - $this->cfg['width'] || $this->cfg['width'] = $this->cfg['length'] * $this->cfg['fontSize']*0.9; - - // 图片高(px) - $this->cfg['height'] || $this->cfg['height'] = $this->cfg['fontSize'] * 1.36; - - if ($this->cfg['useBgImg']) { - // 使用图片背景 - - // 建立一幅 $this->cfg['width'] x $this->cfg['height'] 的图像 - $this->image = imagecreatetruecolor($this->cfg['width'], $this->cfg['height']); - - $this->setBgImg(); - } else { - // 使用纯色背景 - // 建立一幅 $this->cfg['width'] x $this->cfg['height'] 的图像 - $this->image = imagecreate($this->cfg['width'], $this->cfg['height']); - - imagecolorallocate($this->image, $this->cfg['bgColor'][0], - $this->cfg['bgColor'][1], $this->cfg['bgColor'][2]); - } - - // 验证码文字颜色 - $this->color = imagecolorallocate($this->image, $this->cfg['color'][0], - $this->cfg['color'][1], $this->cfg['color'][2]); - - // 验证码使用随机字体 - $ttf = dirname(dirname(__DIR__)) . '/assets/gd_simple/code.ttf'; - - // 绘验证码 - $code = []; // 验证码 - $codeNX = - $this->cfg['fontSize']*0.3; // 验证码第N个字符的左边距 - $this->cfg['gradient'] < 5 && $this->cfg['gradient'] = 5; - for ($i = 0; $i<$this->cfg['length']; $i++) { - $code[$i] = $this->cfg['codeSet'][mt_rand(0, strlen($this->cfg['codeSet'])-1)]; - if ($i > 0 && in_array($code[$i-1], ['M', 'W'])) { - // 最宽的 MW - $codeNX += $this->cfg['fontSize']*0.8; - } elseif ($i > 0 && in_array($code[$i-1], ['B', 'G', 'H', 'N'])) { - // 较宽易混淆的字符 - $codeNX += $this->cfg['fontSize']*0.7; - } elseif ($i > 0 && (is_numeric($code[$i-1]) - || in_array($code[$i-1], [6, 7, 9, 'A', 'C', 'F', 'L', 'P', 'T', 'V']))) { - // 不易混淆的字符 679ACFLPTV - $codeNX += $this->cfg['fontSize']*0.5; - } else { - $codeNX += $this->cfg['fontSize']*0.6; - } - - // 倾斜度 - $gradient = mt_rand(-$this->cfg['gradient'], $this->cfg['gradient']); - - // 写一个验证码字符 - imagettftext($this->image, $this->cfg['fontSize'], $gradient, - $codeNX, $this->cfg['fontSize']*1.1, $this->color, $ttf, $code[$i]); - } - - // 保存验证码 - \wf\captcha\Code::save(join('', $code), time() + $this->cfg['expire'], $id); - - 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"); - - // 扭曲验证码图片 - if (intval(@$this->cfg['distortLevel']) > 0) { - \wf\captcha\Code::distort($this->image, (int)$this->cfg['distortLevel']); - } - - // 输出验证码图像 - imagepng($this->image); - imagedestroy($this->image); - } - - /** - * 设置验证码背景图片 - */ - private function setBgImg() - { - // 随机选择背景图片 - $imgId = mt_rand(1, 8); - $bgImgPath = dirname(dirname(__DIR__)) . "/assets/gd_simple/bgs/{$imgId}.jpg"; - list($width, $height) = @getimagesize($bgImgPath); - - // 复制背景图片设置 - $bgImage = @imagecreatefromjpeg($bgImgPath); - $srcX = mt_rand(0, floor($width - $this->cfg['width'])); - $srcY = mt_rand(0, floor($height - $this->cfg['height'])); - - @imagecopy($this->image, $bgImage, 0, 0, $srcX, $srcY, $this->cfg['width'], $this->cfg['height']); - @imagedestroy($bgImage); - } -} - - - diff --git a/test/test.php b/test/test.php new file mode 100644 index 0000000..21b44a6 --- /dev/null +++ b/test/test.php @@ -0,0 +1,20 @@ + false, // 是否使用背景图片 + 'useNoise' => false, // 是否添加干扰字符 + 'curve' => 1, // 画混淆曲线数量 + 'distort' => 0, // 扭曲级别(0-9),0为不扭曲,建议为验证码字体大小/8 + 'length' => 4, // 验证码位数 + 'fontSize' => 36, // 验证码字体大小(px) +]); + +// set to session +session_start(); +$_SESSION['phrase'] = $capt->getPhrase(); + +$capt->output(90); + +//echo $capt->get(); diff --git a/test/testGD.php b/test/testGD.php deleted file mode 100644 index efe11b8..0000000 --- a/test/testGD.php +++ /dev/null @@ -1,14 +0,0 @@ -render('login'); - -// 验证码对比校验 -//if (!\wf\captcha\Code::check(@$_POST['secode'], 'login')) { -// print 'error secode'; -//} - diff --git a/test/testGDSimple.php b/test/testGDSimple.php deleted file mode 100644 index d97f16e..0000000 --- a/test/testGDSimple.php +++ /dev/null @@ -1,14 +0,0 @@ -render('login'); - -// 验证码对比校验 -//if (!\wf\captcha\Code::check(@$_POST['secode'], 'login')) { -// print 'error secode'; -//} -