收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 19308|回复: 10

[其它] 验证码是怎样被绕过的!

[复制链接]
发表于 2010-7-28 22:51:41 | 显示全部楼层 |阅读模式
最近好多朋友遭遇验证码被绕过灌水的事情,他们给了我代码,一看果不其然!
我们先来分析下,有验证码发布的流程
1,显示表单
2,显示验证码(条用生成验证码的程序), 将验证码加密后放进 session 或者 cookie
3,用户提交表单
4,核对验证码无误,数据合法后 写入数据库完成

用户如果再发布一条,正常情况下,会再次访问表单页面,验证码图片被动 更新, session 和 cookie 也就跟着变了
但是灌水机操作 不一定非要使用表单页面,它可以直接 模拟POST 向服务端程序 发送数据;这样验证码程序没有被调用,当然session和cookie存储的加密验证码就是上次的值,也就没有更新,这样以后无限次的通过POST直接发送的数据 ,而不考虑验证码,验证码形同虚设!

所以,在核对验证码后 先将 session和cookie的值清空,然后做数据合法性判断,然偶入库!
这样 一个漏洞就被补上了!

举例:
表单页面

  1. <form action="save.php" method="post">
  2. ......
  3. <input type="text" name="vcode" size="4" /> <img src="vcode.php" alt="看不清请刷新页面" />
  4. </form>
复制代码

生成验证码图片的程序

  1. <?php
  2. session_start();
  3. ......
  4. $v = new Authcode();
  5. $vcode = $v->getAuthcode();
  6. $_SESSION['vcode'] = md5($vcode );
  7. ........
  8. ?>
复制代码

form 数据接受处理程序

  1. <?php
  2. if ( md5($_POST['vcode']) == $_SESSION['vcode']  ) {
  3.     $_SESSION['vcode']='';//这句非常重要
  4. } else {
  5.     exit '验证码不对!';
  6. }
  7. //接下来的处理
  8. ......
  9. ?>
复制代码
发表于 2010-7-29 07:29:43 | 显示全部楼层
cookies其实是没办法被清空的...
回复 支持 反对

使用道具 举报

发表于 2010-7-29 14:00:12 | 显示全部楼层
其实就是提交完数据后
再加一句
$_SESSION['vcode']=''
把session清空就好。
回复 支持 反对

使用道具 举报

发表于 2010-8-7 11:56:45 | 显示全部楼层
那session_unregister('vcode')也是可以的吧?
回复 支持 反对

使用道具 举报

发表于 2010-8-10 15:01:40 | 显示全部楼层
其实大家都经常忽略这个问题,我记得补上呵呵
回复 支持 反对

使用道具 举报

发表于 2010-9-22 20:46:10 | 显示全部楼层
分析的不错, 现在就去检查一下,关注的程序.
回复 支持 反对

使用道具 举报

发表于 2010-9-22 22:20:55 | 显示全部楼层
谢谢fonqing提醒.
回复 支持 反对

使用道具 举报

发表于 2010-9-22 23:11:14 | 显示全部楼层
这种做法还不错,以前一直没想过这样做。都按DZ BBS做法来处理的。
回复 支持 反对

使用道具 举报

发表于 2010-9-23 10:17:29 | 显示全部楼层

回复 2# KarasCanvas 的帖子

无知...
敢问你说的这句
cookies其实是没办法被清空的...
是从哪得到的知识,还是自己实践出来的结果?

[[i] 本帖最后由 faeng220 于 2010-9-23 10:18 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2010-9-23 11:44:31 | 显示全部楼层
原帖由 [i]faeng220 于 2010-9-23 10:17 发表
无知...
敢问你说的这句是从哪得到的知识,还是自己实践出来的结果?


我的意思是,如果有人要特意绕过验证码,那他自己肯定多少会了解web的机制,客户端的数据基本都是可以伪造的,如果我的客户端不管你的http头,一直用上次请求获取到的cookie来提交呢
回复 支持 反对

使用道具 举报

发表于 2010-9-23 12:48:43 | 显示全部楼层

回复 10# KarasCanvas 的帖子

一直使用上一次的Cookie来提交,对服务器来说无意义,因为如果上一个与Cookie对应的Session记录被释放之后,你提交的Cookie服务器找不到与它对应的描述,那它就是无任何意义的,服务器会忽略掉你提交.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-8-7 13:08 , Processed in 0.124684 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表