设计无状态验证码,大家看下是否可行,有没有什么漏洞?

2016-03-30 11:49:05 +08:00
 guyskk

无状态验证码不需要在 SESSION 中保存数据,流程如下:

  1. 服务端先配置一个密钥 KEY
  2. 客户端请求验证码 TOKEN, 服务端生成一个随机字符串 TEXT ,再生成一个 SALT ,用 KEY 和 SALT 对 TEXT 进行加密 加密后的 TEXT 和 SALT 拼接到一起,作为 TOKEN 返回给客户端
  3. 客户端请求验证码图片,携带验证码 TOKEN, 服务端根据 KEY 和 TOKEN 中的 SALT ,解密出 TEXT ,用这个 TEXT 生成一幅图片
  4. 客户端发送业务请求,携带验证码 TOKEN 和用户输入的 CODE, 服务端根据 KEY 和 TOKEN 中的 SALT ,解密出 TEXT ,和 CODE 比对

代码 https://github.com/guyskk/kkblog/blob/master/kkblog/captcha.py

大家看下是否可行,有没有什么漏洞?

7707 次点击
所在节点    Python
31 条回复
jedyu
2016-03-30 11:55:03 +08:00
把 Session 中的数据挪到了 Token 中而已
cxh116
2016-03-30 11:56:39 +08:00
你要明白 session 的 id 不过是存在 cookie 里面的一个 token 而已.
guyskk
2016-03-30 11:58:05 +08:00
@jedyu 是的,这样服务器就不需要保存 Session ,客户端也可以不用 Cookie
Archangel_SDY
2016-03-30 11:59:08 +08:00
这个验证码没有有效期,并且可以多次使用? 那我始终拿一组 Token 和 Code 去刷就可以了呗.
loading
2016-03-30 12:01:01 +08:00
jugelizi
2016-03-30 12:04:17 +08:00
哈后 4L 一脚踢坏了楼主的轮子
guyskk
2016-03-30 12:06:53 +08:00
@Archangel_SDY 确实是。在第 2 步中,随机字符串 TEXT 后面再加上有效期应该可以。验证码在有效期内可以重复使用。
ybdhjeak
2016-03-30 12:10:13 +08:00
直接把 code 加密写进 cookie 不就行了,下次让客户端带着 cookie 和验证码一起来
guyskk
2016-03-30 12:11:40 +08:00
@guyskk 有效期 1~3 分钟
ybdhjeak
2016-03-30 12:12:11 +08:00
你的 token 和 cookie 没啥区别吧,只不过是传递方式不同, session id 也可以用参数形式传递啊
gy911201
2016-03-30 12:14:17 +08:00
@guyskk 不加仅能使用一次的限制,验证码就形同虚设,对于暴力提交请求的程序来说, 1 分钟识别一次验证码相当于没有验证码
keller
2016-03-30 12:17:14 +08:00
有效期内这个验证码不就可以无限使用啊?
ty0716
2016-03-30 12:18:09 +08:00
应该携带一个应用的 id,有效时间是多少,当下次刷新时,自动将该应用 id 的验证码删掉,
反正就是要保证验证码只能用一次。 不然还叫什么验证码
dndx
2016-03-30 12:20:55 +08:00
目测有效期内可以重放,对机器人来说还是很方便的。
knightdf
2016-03-30 13:03:13 +08:00
这不是一次性的验证码。。。
menc
2016-03-30 13:25:33 +08:00
没有漏洞,而且是业界一直在采用的方案。。
不过业界把这个东西叫做 csrf token ,因为这样一次性的 token 可以防止 csrf 攻击,
事实上,如果 token 用后即扔的话,用不着对 token 这么大张旗鼓的做手脚
knightdf
2016-03-30 13:30:01 +08:00
@menc 大哥,你是混哪个业界的?好屌
flowfire
2016-03-30 14:22:46 +08:00
何必呢。。。
cheneydog
2016-03-30 14:42:48 +08:00
1. 服务端的密钥 KEY 是全局的所有用户所有请求都一样
2. 加密后的 TEXT 和 SALT 拼接到一起返回,相当于暴漏了 SALT
有一定的被猜解的可能性。


也不觉得比加密后写入 cookie 有什么优势。
wlsnx
2016-03-30 14:58:16 +08:00
有点奇怪,为了避免保存数据,所以每次都生成新数据,逻辑更复杂了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/267305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX