事情的起因: 之前一直跟安卓和 ios 做 api,使用 jwt 的形式进行交互。
今天突发奇想,如何保证 token 的安全性那。假如我拿到 token 就可以调用服务器端的任何接口。这是多么的可怕。
目前为上线的项目都是 https。
求解???
![]() | 1 oott123 2019-08-22 16:30:55 +08:00 ![]() 假如我拿到你的帐号密码,我可以登录你的帐号,这是多么的可怕。 |
![]() | 2 miaomiao0323 2019-08-22 16:34:16 +08:00 token 不要放在 get 的参数里,容易通过 referer 泄漏。 |
3 XRR 2019-08-22 16:34:20 +08:00 token 劫持,可以校验登陆的 ip 和调用接口时的 ip,如果有不同就要求用户重新登陆 |
4 diferent 2019-08-22 16:42:47 +08:00 ![]() @XRR 移动端怎么办. 高铁,开发换基站. 家里移动网络和 WIFI 互换. 互联网场景没有哪家会这么严格的. 除非是银行金融 APP |
![]() | 5 baiyi 2019-08-22 16:47:27 +08:00 ![]() @XRR #3 这样用户体验太差了,不建议这么做 有 https 防中间人就够了,你没有办法保证用户不会丢失 token,就像你没有办法保证用户不会将密码告诉别人一样 不过可以做一些措施保证用户丢失 token 后,你能尽量减少损失,或者通知用户。比如说刷新 token,判断常用 ip 等方法 |
7 jorneyr 2019-08-22 16:48:59 +08:00 ![]() 你拿到 cookie 一样可以调用服务器端的任何接口,所以 token 和 cookie 没有本质区别。 |
8 codeyuyu 2019-08-22 17:00:32 +08:00 所以 安全性强的不会用 jwt,因为无状态和吊销无法两全 |
![]() | 9 AreYou0k 2019-08-22 17:02:10 +08:00 ![]() 建议用脑电波登录 |
10 arrow8899 2019-08-22 17:12:44 +08:00 汗。。。只要你用了 HTTPS,双向证书校验,数据库密码加密 + hash,日志脱敏,那么别人基本不可能获取到用户的 token,除非用户主动把密码告诉别人,这种你可以参考支付宝的风控技术。 |
![]() | 11 maichael 2019-08-22 17:18:50 +08:00 你不防中间人,你用啥鉴权都有这问题呀。 |
![]() | 12 chinvo 2019-08-22 17:19:12 +08:00 via iPhone 如果你认为你担心的问题 https 不能解决,那么你所担心的就是反机器人问题 |
![]() | 13 guokeke 2019-08-22 17:36:31 +08:00 登录的时候手机二次验证 :> |
![]() | 14 flyingghost 2019-08-22 17:50:03 +08:00 假如我拿到你的手机,我可以查看修改你的所有数据,这是多么的可怕! 所以说我们应该抛弃手机吗? 既然很难有什么技术是“绝对安全”的,我们就需要唾弃所有那些有漏洞的技术方案吗? 安全从来都是有限制有范围的相对安全。请在明确定义安全防护能力的前提下选择技术方案。 如果你需要考虑 token 失密问题,那就给方案打补丁(比如缩短 token 有效期)或者换方案(比如双端证书)。 如果你需要考虑密码失密问题,那就上指纹上虹膜。 如果你需要考虑手机丢失问题。。。 如果你需要考虑用户已叛国成为间谍问题。。。 你可以无限制的加高安全壁垒,相应的你需要付出相应的成本。 |
![]() | 15 lurenw 2019-08-22 17:56:14 +08:00 token 不保证安全, 保证安全的是 HTTPS |
![]() | 16 tachikomachann 2019-08-22 17:58:38 +08:00 via Android jwt 有别于其他方式的安全问题在于,不依赖服务端保存 token 的话,无法实现某个 jwt 主动失效(非过期失效)。 所以要么缩短每个 jwt 的有效期,要么还是要服务端再存一份。 |
![]() | 17 Mutoo 2019-08-22 19:50:35 +08:00 1) Rule-Based Access Control: 将接口权限分散,各 token 执有的权限不尽相同,切不可一个 token 拥有所有权限。 2) 对不同的权限设置合理的过期时间。 3) 传输 token 时使用 https 并把 token 放在 request header 的 auth 字段。保证 token 不被中间人获取,不进入日志系统。 |
![]() | 18 areless 2019-08-22 20:51:18 +08:00 via Android jwt 有鬼 ip 客户端特征,就用字符串混淆了一下便是现代 api 的通用方案了(笑)。公网只能判断客户端特征。内网绑定 mac 固化 arp,靠网络技术而非编程技巧了 |
![]() | 19 Varobjs 2019-08-22 22:19:54 +08:00 via Android @arrow8899 请教一下,日志脱敏很有必要吗?日志不是给开发调试看的吗,难道不是越详细越好?举个例子,数据库连接失败,密码都错配置了,如果脱敏那就看不到有效信息了 |
20 1762628386 2019-08-22 22:21:45 +08:00 别把 token 当会话使用,一个功能一个 token |
![]() | 21 iyaozhen 2019-08-23 00:12:48 +08:00 |
22 trn4 2019-08-23 02:25:33 +08:00 @tachikomachann jwt 有 exp 的 claim 啊 |
![]() | 23 skiy 2019-08-23 07:22:06 +08:00 via Android jwt 就没啥安全性可言。之前了解过。还不如直接用 token |
24 fengpan567 2019-08-23 08:25:43 +08:00 为什么要保证?都拿到了你的 token 或者 cookie 了,说明安全问题已经出现了 |
![]() | 25 Perolong 2019-08-23 08:33:53 +08:00 via Android 因为一般一个 token 只是能拿到当前用户的权限,并不是 admin 级别的啊,你自己的 token 是删不了其他用户的东西的,如果可以,说明后台偷懒了 |
![]() | 26 HarryQu 2019-08-23 08:47:38 +08:00 via Android ![]() 设备生产一个 唯一的 device id, 登录的时候 存储 device id。 同时验证 token 和 deviceid。 |
![]() | 27 Leigg 2019-08-23 09:23:04 +08:00 via Android 尝试过 jwt,认为不是一个适用于登录登出场景的方案,用户修改密码,注销登陆都不好解决,或者说都需要数据库来辅助实现,倒不如直接使用 token。有 redis 的辅助,可以很方便实现在线用户数统计,用户实际在线时长统计。所以啊,jwt 还是更适用于一次性的数据传输。 |
![]() | 28 iamdj 2019-08-23 09:34:33 +08:00 via Android 额 按道理说调用后台的话 先解析 token 获取比如说用户名 然后根据用户名再查这个用户有没有权限类似的 怎么就会调用所有接口呢。 |
![]() | 29 print1024 2019-08-23 10:21:24 +08:00 jwt 只是为了方便系统间交互,并不安全,想安全那就要在网络传输方面下功夫 |
![]() | 30 dosmlp 2019-08-23 10:32:47 +08:00 用 https 防劫持,至于端的安全你是无能为力的 |
![]() | 31 Vegetable 2019-08-23 10:34:42 +08:00 你凭什么能拿到别人的 token? |
![]() | 32 nikandaoleshenme 2019-08-23 10:42:02 +08:00 1 楼回答已经结贴了,sf 发的帖,又跑这来了 |
![]() | 33 unco020511 2019-08-23 11:01:05 +08:00 别人拿到你的 token 也没用,你接口如果有签名校验,怎么攻击你,参考支付宝和微信的接口 |
![]() | 34 tachikomachann 2019-08-23 11:09:57 +08:00 @xiadong1994 #22 jwt 的 exp 没法实现服务端主动失效吧?比如用户登出后注销所有会话,用户改密码了,用户被禁用了。 |
35 yule111222 2019-08-23 11:11:56 +08:00 后端也不是有一个 token 就能访问所有服务的呀。。。没有权限控制? |
36 luozic 2019-08-23 15:53:30 +08:00 token 有啥?没有 RABC 的锅找 token 背? |