1
sampeng 2020-12-20 09:29:01 +08:00 via iPhone
验证在服务端进行,客户端只是体验
|
2
eason1874 2020-12-20 09:29:32 +08:00
无状态,加盐加时间戳能防破解,但是在有效期内有重放问题,适合的场景不多。
|
3
lpts007 2020-12-20 09:29:37 +08:00 via Android
“而前端进行验证码检验的时候,通过验算决定是否放行。”
这意思还是前端判断是否正确? |
4
imdong 2020-12-20 09:36:19 +08:00 via iPhone
方案一(常见)
将验证码存于用户 Session 之中(具体方法有很多),验证后删除。 方案二(和你的做法相似) 生成的验证码进行加密或不可逆哈希(应该加盐防止彩虹表攻击),然后应该绑定一个时间与唯一 ID,如一分钟内有效,验证成功后将唯一 ID 存起来,一分钟内不允许使用,防止重放攻击。 |
5
jzmws 2020-12-20 09:58:45 +08:00
@imdong 相对来说第二种更好一些, 0202 年基于 session 认证有很多坑, 前后端跨域在 chrome 80 以上同步不到 session
配合配合 redis 就很方便了 ,不用去管理验证码失效的问题 1. 获取验证 把图片显示给前端的同时,并且带上当前验证码存储的 key 值 2.前端提交时候 用验证码的 key 值和输入内容 3.通过 key 去取 redis 中内容和输入比较 |
6
gam2046 2020-12-20 11:52:42 +08:00
前端是不可信的,任何在客户端运行的代码都不可信,服务端不能假定任何输入数据是没有被篡改过的。
因此如果是前端通过某种离线算法验证,那么整套验证机制就形同虚设了。未经授权的访问都可以通过相同的路径访问,因为服务端无法区分。 |
7
westoy 2020-12-20 12:07:28 +08:00
哪有啥真正的无状态啊, 你就算用 secure cookie 做 session, 用户改个密码要多个设备同步登出不还得服务端保存一个 token 做检验嘛
|
8
johnsona 2020-12-20 15:36:25 +08:00 via iPhone
@westoy 我之前总监就被网上博客忽悠瘸了,要什么无状态,自己也说不清楚,服务端不存状态的话,很多业务场景没办法给他做
|
11
black11black OP @lpts007 表述错误,意思是前端发送这个请求时,(后端)完成检验
|
12
black11black OP @johnsona 这有啥说不清楚的,当然要无状态,要不然服务可用性怎么拉上去?
|
13
johnsona 2020-12-20 21:42:13 +08:00
@black11black 不是说你这个业务,我是说有的业务,比如有的人说 jwt 好,不用存后端,无状态,验证签名就好了,还可以存数据,不会被窜改,可以横向扩展,那退出登录怎么做,revoke jwt 还是要加一个黑名单,这就有的人乱搞的无状态
|
15
black11black OP |
16
black11black OP @johnsona 分布式 session 具体实现上怎么操作?维护一个进程间通信协议?或者 nginx 绑定 ip ?
|
17
wellsc 2020-12-20 22:06:26 +08:00
@black11black 可以用 redis 实现,和缓存差不多道理的
|
18
johnsona 2020-12-20 22:35:54 +08:00 via iPhone
@black11black 百度
|
19
johnsona 2020-12-20 22:36:43 +08:00 via iPhone
@black11black 感觉你想的太复杂或者可能受 tomcat 影响吗
|
20
johnsona 2020-12-20 22:58:36 +08:00 via iPhone
@black11black 你怎么跟产品解释说不做退出登陆,产品会觉得这么简单的功能
|
21
Oceanhime 2020-12-20 23:08:12 +08:00
可以看看 vcaptcha 的离线验证方案, 和你的意思感觉差不多?
https://www.vaptcha.com/document/faq.html#%E7%A6%BB%E7%BA%BF%E9%AA%8C%E8%AF%81%E6%A8%A1%E5%BC%8F%E5%8E%9F%E7%90%86 非利益相关 |
22
black11black OP @johnsona 不不,退出当然可以做,我的意思是即使后端没法验证退出,实际上倒不构成安全问题
|
23
ysc3839 2020-12-21 15:07:28 +08:00 via Android
我最近也有类似需求,最终选择的方案是 Encrypted JWT,有效期设为 2 分钟,使用后加到缓存中避免重放攻击。
登录后也是返回 JWT,退出登录的话是禁止多处登录,然后数据库里面存一个 token valid since 时间戳,每次登录或者退出登录直接更新这个。 |
24
johnsona 2020-12-21 15:26:46 +08:00 via iPhone
@black11black 我当时就这么搞的,我让前段退出直接删除 token 就行了,我不要面子的吗?他们不懂还以为我不行,而且前段删除 token,这个 token 还没 revoke 呢
|
25
black11black OP @ysc3839 token valid since 是指维护一个进程间共享缓存,退出登录以后把这个 token 设为 invalid ?
|
26
ysc3839 2020-12-22 08:51:56 +08:00 via Android
@black11black 只是存时间戳,在此时间戳之前签发的 token 都无效。
|