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

2016 年 3 月 30 日
 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

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

9082 次点击
所在节点    Python
31 条回复
qiyuey
2016 年 3 月 30 日
你只是做了一个简化版的 session
shade
2016 年 3 月 30 日
OAuth 也是这样的吧
cevincheung
2016 年 3 月 30 日
@wlsnx web 集群解决 session 一致性
Abirdcfly
2016 年 3 月 30 日
@knightdf 我觉得他说的没错啊。默认是 cookie 来做这些事情。有的禁止 cookies ,不就用的是这个方案?
zwzmzd
2016 年 3 月 30 日
ddou
2016 年 3 月 30 日
@zwzmzd 内容不错,非常感谢。
shade
2016 年 3 月 31 日
webhook 是什么?
guyskk
2016 年 3 月 31 日
@shade kkblog 代码里面的吗,那个是 github 的开放接口
playsoso
2016 年 6 月 23 日
我觉得可以使用 jwe 方案 ,也就是 jwt 其中客户端内容加密过 , 请求验证码同时 发放 token , 提交验证码时携带 token
通过 token 里 签发时间和过期时间来判断是否有效 , token 内容与验证码结果做比对
playsoso
2016 年 6 月 23 日
@playsoso 因为涉及到重放攻击,而且验证码有状态 服务端需要记录是否发放过验证码 和 验证码是否已验证过,所以还是需要依赖服务端 状态保存
guyskk
2016 年 6 月 23 日
@playsoso 要保证验证码只能用一次,服务端必需要有状态,所以无解。

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

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

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

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

© 2021 V2EX