一个简单的不需要gd库的验证码方案

来源:百度文库 编辑:神马文学网 时间:2024/03/29 23:23:01
Printable Version of Topic
Click here to view this topic in its original format
Exceed PHP Club > Advanced PHP > 一个简单的不需要gd库的验证码方案
Posted by: hick 2006-05-13 21:42
前言
==================================================
嘿嘿,以前想过 n 次,怎么让验证码脱离 gd/其他图形库 等。曾经发现有人使用简单的 问题和答案匹配的方法,比如“1 加 2 等于几”,确实比较有意思,虽然咋看起来可能毛病多多,但是做得比较好的话完全可以摆脱 gd 库。
具体方案
==================================================
aDang 同学在 http://club.phpe.net/index.php?s=&act=ST&f=15&t=13164&st=0 提到一个 随机账号 的做法,突然受到启发:
1. 先准备 所有字母数字的 62 张不容易被分析出来的图片, 要不干脆简单点 10 张数字的图片吧。
2. 按一定的映射关系,重命名所有图片文件,比如 0.gif => 1, 2.gif => 9 .... 并把这个映射关系保存下来,给用户显示验证码的时候直接调用图片组合,嘿嘿,怎么验证不用多说了吧...
3. 然后要做的,就是按照一定的时间周期,重新生成映射关系,以防止映射关系被人猜到。
优缺点
==================================================
优点
---------------------------------------------
1. 不需要 gd 库或者其他的图片处理
2. 不依赖 session 等,可以通过隐藏 input 标记显示的验证码图片集
缺点
---------------------------------------------
欢迎大家挑刺 嘿嘿。现在我能够想到的问题有
1. 切换映射关系的时候部分用户的验证码可能会被“误解”。所以切换的频率不能够太快,一般一天一次差不多吧
2. 如果人工识别,比较容易识别出映射关系,增加图片张数可以提高识别难度。
3. 如果人工识别一个验证码, browser 可以在映射关系改变之前一直利用这个验证码。可以在给用户的验证码提交表单form里,把隐藏 input 的值设置为 UNIX 时间戳(或稍微加一点算法),作为显示验证码图片的依据,一个附带的好处就是可以规定验证码的有效时间。
后注:刚才发现忘记了英文字母个数是 26 个还是 24 个了,哈哈。
Posted by: cid73 2006-05-13 22:23
防止图片验证码被识别主要还是要防 ocr 吧? 你也没必要搞什么映射, 给用户一个 session, 搞些随机映射比如 ‘a‘ => ‘23hhg‘, ‘x‘ => ‘ufh0d‘ 这样, 图片地址也用这些随机码, 用这个 session 去校验用户提交的字符串, 这样更方便.
Posted by: cid73 2006-05-13 22:27
关于防止 ocr 我想过一招, 用你那样的静态图片, 但是把图片切成小块例如 4 块, 用表格把它们组合起来, 这样人眼看起来是一张完整的图片, 而 ocr 软件一看, 我晕, 只是一个字的四分之一
Posted by: hick 2006-05-13 22:40
QUOTE (cid73 @ 2006-05-13 22:23)
防止图片验证码被识别主要还是要防 ocr 吧? 你也没必要搞什么映射, 给用户一个 session, 搞些随机映射比如 ‘a‘ => ‘23hhg‘, ‘x‘ => ‘ufh0d‘ 这样, 图片地址也用这些随机码, 用这个 session 去校验用户提交的字符串, 这样更方便.
映射有两个目的:
1. 服务器可以很方便的获知显示给用户的验证码有哪几个文件,不用根据 session 或者其他东西来确认图片显示的字符。我写程序的原则是能够不用 session ,就不用。对一般的 blog 很有用,我自己正构思一个静态化的 blog,更不好弄 session 了。
2. 随时变更映射,可以防止人工识别出来映射关系以后,验证码就失效了。我还没见过有人拿经过简单映射关系的图片当验证码糊弄人,嘿嘿,直接显示数字文本的笨蛋倒是见过。。。
Posted by: james.liu 2006-05-13 22:42
QUOTE (cid73 @ 2006-05-13 22:27)
关于防止 ocr 我想过一招, 用你那样的静态图片, 但是把图片切成小块例如 4 块, 用表格把它们组合起来, 这样人眼看起来是一张完整的图片, 而 ocr 软件一看, 我晕, 只是一个字的四分之一
这个主意8错...
Posted by: hick 2006-05-13 22:47
QUOTE (cid73 @ 2006-05-13 22:27)
关于防止 ocr 我想过一招, 用你那样的静态图片, 但是把图片切成小块例如 4 块, 用表格把它们组合起来, 这样人眼看起来是一张完整的图片, 而 ocr 软件一看, 我晕, 只是一个字的四分之一
嘿嘿,某人怎么又删帖了。。。
防 ocr, 象 MS 做得比较绝,我对他们那种做法都十分反感, nnd,别说 ocr 了,我过去了有些也识别不出来
其实防 ocr 应该比较简单,常见的是加入随机的点线等。 退一步说,只要是规则的图片,都可以被 OCR 识别,所以只有产生随机的干扰色了。以前就有人把 CU 的识别码用 php 给破了不是 嘿嘿 当然主要是因为那个验证码一点干扰色都没有...
Posted by: legend 2006-05-13 22:58
不需要GD库也可以生成图片啊,比如说生成bmp的就比较简单,文件头及信息头固定,然后把点阵写进去就是了。
图片验证码现在搞得越来越BT,人眼都很难识别。我看以后有朝声音验证码的趋势发展了。
Posted by: hick 2006-05-13 23:03
QUOTE (legend @ 2006-05-13 22:58)
不需要GD库也可以生成图片啊,比如说生成bmp的就比较简单,文件头及信息头固定,然后把点阵写进去就是了。
图片验证码现在搞得越来越BT,人眼都很难识别。我看以后有朝声音验证码的趋势发展了。
没注意,以前好象谁在这里贴过? 不是你贴吧?
我大概看了一下,记得好象用到了什么特殊的函数生成的 bmp 图片?
忘记在什么地方都已经看到有声音验证码了,嘿嘿,而且巨 bt,说了一大段英文,我听了三遍楞没听出来...
Posted by: james.liu 2006-05-13 23:07
QUOTE (hick @ 2006-05-13 23:03)
QUOTE (legend @ 2006-05-13 22:58)
不需要GD库也可以生成图片啊,比如说生成bmp的就比较简单,文件头及信息头固定,然后把点阵写进去就是了。
图片验证码现在搞得越来越BT,人眼都很难识别。我看以后有朝声音验证码的趋势发展了。
没注意,以前好象谁在这里贴过? 不是你贴吧?
我大概看了一下,记得好象用到了什么特殊的函数生成的 bmp 图片?
忘记在什么地方都已经看到有声音验证码了,嘿嘿,而且巨 bt,说了一大段英文,我听了三遍楞没听出来...
具8可靠信息
为了避免出现听8懂得英文读音,中国政府决定派出008jl来完成。
到时候大家都有耳福拉
Posted by: legend 2006-05-13 23:14
QUOTE (hick @ 2006-05-13 23:03)
没注意,以前好象谁在这里贴过? 不是你贴吧?
我大概看了一下,记得好象用到了什么特殊的函数生成的 bmp 图片?
忘记在什么地方都已经看到有声音验证码了,嘿嘿,而且巨 bt,说了一大段英文,我听了三遍楞没听出来...
不是我贴的,我是在搞imagebmp的时候,了解到生成bmp格式的验证码图片非常简单,定好文件头跟信息头,然后直接往里写数字或字母的点阵数据就可以了。
passport的注册就有图片验证码跟声音验证码两种选择。
Posted by: hick 2006-05-13 23:22
to legend
baidu 一搜 imagebmp 就到了你 blog 上
http://www.ugia.cn/wp-data/imagebmp.php 上的代码是吗? 里面好象用到了需要 gd 库的函数,比如 imagetruecolortopalette(这个函数名也起得够次的 sigh)
Posted by: legend 2006-05-13 23:25
QUOTE (hick @ 2006-05-13 23:22)
to legend
baidu 一搜 imagebmp 就到了你 blog 上
http://www.ugia.cn/wp-data/imagebmp.php 上的代码是吗? 里面好象用到了需要 gd 库的函数,比如 imagetruecolortopalette(这个函数名也起得够次的 sigh)
我写的那个imagebmp是需要gd,因为需要读取其他格式的图片。
如果单纯验证码图片的话,因为点阵数据比较简单,颜色也不需要太复杂,直接写就可以了。
Posted by: cid73 2006-05-13 23:28
QUOTE (legend @ 2006-05-13 22:58)
不需要GD库也可以生成图片啊,比如说生成bmp的就比较简单,文件头及信息头固定,然后把点阵写进去就是了。
图片验证码现在搞得越来越BT,人眼都很难识别。我看以后有朝声音验证码的趋势发展了。
那你觉得我的方法如何? 只用非常干净的图片, 用不着那些花里胡哨的东东. 切割的话可以中央对折, 正十字, 九宫格, 还可以镂空, 用层合起来. 镂空的方法就更多了, 比如象瑞士国旗那样刻出一个十字在中央, 或者星型放射之类, 还可以随机组合, 第一张是米老鼠, 第二张小飞机...玩死 ocr, 呵呵
Posted by: legend 2006-05-13 23:33
QUOTE (cid73 @ 2006-05-13 23:28)
QUOTE (legend @ 2006-05-13 22:58)
不需要GD库也可以生成图片啊,比如说生成bmp的就比较简单,文件头及信息头固定,然后把点阵写进去就是了。
图片验证码现在搞得越来越BT,人眼都很难识别。我看以后有朝声音验证码的趋势发展了。
那你觉得我的方法如何? 只用非常干净的图片, 用不着那些花里胡哨的东东. 切割的话可以中央对折, 正十字, 九宫格, 还可以镂空, 用层合起来. 镂空的方法就更多了, 比如象瑞士国旗那样刻出一个十字在中央, 或者星型放射之类, 还可以随机组合, 第一张是米老鼠, 第二张小飞机...玩死 ocr, 呵呵
暂时想象不出来会是个什么样子
Posted by: wangchun 2006-05-14 12:10
你们的思维都怎么了,放着GD库不用,现在我还没见过不支持GD库的空间,楼主的方法也太土了,其实很简单的
$_SESSION[‘randcode‘] = array(‘1‘,‘aaaa‘);
第一个是图片ID,第二个是上面的文字
randcode.php 中,直接header文件头,readfile($_SESSION[‘randcode‘][0]."gif");不就行了。当然如果遇到知道你算法的人就没用了,文件对比就出来了
判断的时候 if($_POST[‘randcode‘] == $_SESSION[‘randcode‘][1]){}

Posted by: hick 2006-05-14 12:22
晕...
看清楚了再发表意见...
1. gd 库不是每个人都有条件使用的,比如现在众多的 blog。另外图片处理即使很简单,需要消耗的资源不是一般的多。。标题就说了摆脱 gd,如果你认为不需要摆脱,那另当别论。
2. 又拿 session 说事,不是我吝惜,如果你的网站做得够大, session 会很是个问题!
3. 嘿嘿,我也“激”一把,你的方法确实太土了。
Posted by: bleakwind 2006-05-14 12:30
session就像变量一样是个必备的功能啊!因为最起码你会员登陆,后台登陆验证都要session,不用session验证的程序在我印象里不是好程序...
验证码不用session我也觉得不是很保险...
Posted by: trooman 2006-05-14 14:40
看过asp写的,那“点阵”够BT,再出奇一点,可以搞个人体点阵,还有欣赏价值!
Posted by: bleakwind 2006-05-14 15:50
PHP也有人写点阵的东西,那时候freetype还不流行所以就整出来了。。。
不过字体有点看着别扭
Posted by: hick 2006-05-14 20:50
QUOTE (bleakwind @ 2006-05-14 12:30)
session就像变量一样是个必备的功能啊!因为最起码你会员登陆,后台登陆验证都要session,不用session验证的程序在我印象里不是好程序...
验证码不用session我也觉得不是很保险...
验证码不通过 sessin 实现不是说不用 session 进行登录验证。
1. 在登录的时候,不需要 session --- 当然这个开支比较小
2. 很多论坛还有 blog 都是在查看的时候,不管你是否会真的回复,都会显示回复框以及验证码,实际上这个也没必要用 session,这时候的 session 有时候显得多余,并且这样的页面访问量跟登录不是一个数量级!
3. 虽然像我这样成天惦记静态化的人不多,但是不用 session 确实给静态化页面提示验证码带来便利。
Posted by: superspice 2006-05-14 22:03
呵呵。被回复机器人搞怕了你。
Posted by: hick 2006-05-14 22:27
QUOTE (superspice @ 2006-05-14 22:03)
呵呵。被回复机器人搞怕了你。
那确实,嘿嘿...
不只是我,现在 WP 等流行程序,还有一些简单的留言板,充斥着各种 junk robot
Posted by: axgle 2006-05-14 22:54
我的站点没有呢.我盼望着她们的到来--预先已做好了图片验证,呵呵
Posted by: superspice 2006-05-14 22:56
楼主有空做一个comment spammer吧。
期待,呵呵
Powered by Invision Power Board (http://www.invisionboard.com)
© 2002 Invision Power Services (http://www.invisionpower.com)_xyz