12306的验证码长这个样子:
让选择图片.看起来非常完美的图片验证码.比那些简单又没有实用的字母数字验证码组合强太多了.那些字母数字组合直接获取图片光学识别然后填进表单就可以攻破.
我也想实现这样的.
怎么去实现呢?
设计一个简单点的吧.
1.我先收集图片.收集200张.分成20组.每组10张照片
分别是 苹果组,橘子组,美女组等等.
文件目录结构是:
2.后端设计.
配置好 图片组所在的父级路径。配置图片验证码是8张图。
初始化时,通过父级路径就可以使用File.listFiles()获得所有图片组。然后存入list集合里。
每次请求验证码来时,来个随机数
int r = Random.nextInt(list.size());
File defaultFile = list.get(r);
这样就选中了默认的图片组。那么前段验证码的标题就是
String title = "请选择所有的"+defaultFile.getName;//比如请选择所有的美女
然后进入默认图片组里随机抽取一张图片。给个普通标记。并把标记放入有效标记集合里。
接着还有7张图我们要拿到。
for(i = 0; i <7 ;i++){
随机组,随机一张图片,给上普通标记。如果随机组 = 默认图片组,则把该组下抽取的图片的标记放到 有效标记集合里。
}
把有效标记集合存到session里。
然后把图片及普通标记打乱顺序传到前台。
每次校验验证码时,获得其传来的普通标记数组。看是否和session里的有效标记一致即可。
3.前台设计。
展示图片隐藏标记。在校验验证码时只传输选中的图片的普通标记。
ok;
但是缺点很严重。
如果我图片被刷跑完了怎么办?
200张图片,不到1秒就被刷跑完。而且还被刷走了标题。
然后几乎不需要训练,直接对比图片就可以无视我的验证码了。
那如果我要是训练一个简笔画的智能程序,内存里自动生成一些简笔画呢?这样的话图片根本刷不完啊就安全了吧。
额,算了吧。还有图像识别哎!
简直了。论坛上有个人经常说:不要把有限的生命浪费到无限的加密解密循环中。
果然如是。
所谓的WEB安全未来将是一纸空谈吧
也许有两点非常稳定:1.使用第三方账号2.增加成本,比如上行发短信.