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

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

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

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

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

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

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

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

© 2021 V2EX