静态图片实现验证码功能
验证码的作用其实很无奈,1,防止暴力破解,2,防止大规模发贴攻击,取代了时间session机制,后者只能防灌水
大中小网站几乎无一例外都或多或少用了这一功能,虽然很多网站都不值得攻击,甚至不值得一看
很多小网站和爱好者们也是跃跃欲试,采用了各种各样的方法,XMP, BMP,JPG格式,五花八门,很多都是简单的生成图片,
只防小人,不防黑客,如果真的较真,简单图片识别可以解决打开大部门网站的大门,愉快地灌入滔滔洪水
这里我只想提一个很简单的方法来实现验证码的效果
验证码的关键实际上是缩小盲目猜测的几率,越小越好,而不是生成的图片越土老帽,越难认越好
自然地,我们可以采取一些折衷讨巧的办法,而不是靠技术,去实现hotmail那样的带语音朗读的
假如我有10张不同的静态图片,用户猜中的几率就是1/10
假设这就够了!让我们先来解决图片src的问题,显然我们需要伪装的图片src,否则什么用也没有
显然,图片必须是读出来的,而不是返回图片URI,e.g.
http://host/getimg.apsx?id=1 代表第一张显示的图片,效率不回损失很多,如果把图片直接放入全局变量的话
如果我们的验证码一共4位,那么简单的来说,就是
<img src=sss?id=1><img src=sss?id=2>...
4位验证码几率是1/10000,似乎解决了问题,我们可以用这种1/10000的几率的代码么?当谈不是,现在来缩小几率,原理很简单
增加图片数量,和验证码位数,我们有0-9,a-Z一共36个简单符号,6位验证码,几率是1/2176782336
如何?应该够了,现在来解决图片识别的问题,首先,图片是你自己定义的,想怎样复杂都行,
因此图像识别几乎是可以控制的,因为随时可以改变图片内容,但是这样一来,问题也来了,那就是死记来比较,
假设一个用户刚好把我们36张图片全浏览过了,然后每次就进行比对,我们的验证码不攻自破!
既然如此,我们就得再想办法了,假设现在我们36个字符各有10种不同风格,大小的图片,计算一下用户可能核对比较成功的
几率.
尺寸准确需要1000000次,然后每次需要比较36*6次,也就是说一共运算2亿次可以破解
当然,这是建立在你的图片是在巧夺天工,图像识别几乎不可能来说的.
有人愿意用2亿次图片对点来做一次破解,仅仅为了发表一篇稍微带点恶意的广告?
因此,如果你暴力猜测,几率是2亿次,暴力比较,几率也是两亿次...
而我们,有360张精心设计的图片,就放在服务器你不能访问的地方. 具体例子参照www.justee.com