请教一个session安全的一个问题。

xiatianlong
  • 2.2k

问题背景:

如图所示,两个用户,分别同时访问了一个web应用,其中A用户登录了,B用户没有登录。
clipboard.png

问题:
总所周知,JSESSIONID是存在cookie里的,这个时候我在A用户的浏览器里把cookie中的JESSIONID复制出来,替换掉B用户浏览器的JESSIONID,这时候B用户在未登录的情况下就能完全跟A一样的操作,能被直接认证登录。

clipboard.png

关于这种问题,请教有好的解决方案吗?

感谢大家的热心回答,有很多不错的想法和方案。其实我问的不是cookie被不被劫持的问题,而是被劫持后有没有什么好的办法。不是钱包丢不丢的问题,是钱包丢了怎么办,怎么样让钱不被别人用掉的问题。

回复
阅读 4.7k
10 个回答

首先吧。我觉得要拿到这个sessionId不是一件很简单的事情。一般来说只有能碰得到你电脑的人才拿得到吧(因为一般都会给cookie设置httpOnly属性),emmmmm我能打开你电脑了我应该会选择直接查看你的隐私资料啥的吧,而不是选择拿你的sessionId

好吧,如果我不想给你发现我在看的话,我拿了这个id,就跑了。当然也是可以的。

如果你的网站并不是特别多重要的,敏感的涉及到钱的话,其实也不用太在意这件事情。

如果涉及到钱了。那肯定就比较严谨了,会上各种安全措施。比如支付的时候会设置支付密码什么的。如果支付密码也可以泄露出去的话,那大概无解了吧....

如果B用的是A的session,那么就没有B这个用户了,对服务器来说是根据session来判断用户的,这种情况下服务器看到的都是A,没有B

两个不相干的用户访问网站,JSESSIONID都能被泄露,只能说这两个人认识,除此之外没其他想法。
就像百度一样,你把你的cookie给另外一个用户,百度也会认为是同一个人在操作

ip变了,session失效,要求重新登录。

HTTP协议是无状态,作为服务端识别用户主要依靠COOKIE中的JSESSIONID,作为秘钥,去SESSION存储中找对应该KEY的SESSION数据,所以和楼上说的一样,服务器并不认A,B,只通过JSESSIONID识别用户。

如果A的浏览器能被操作,相当于电脑已经被控制一半了...

另外为了防止XSS攻击啥的,可以设置HTTPOnly禁止JS操作COOKIE,当然此时浏览器还是可以操作COOKIE的,毕竟权限要高点嘛。

所以这种不用担心,如果还是不放心,还可以加上一个Token(例如CSRF_TOKEN)来验证,把SESSION过期时间设置短点。当然还有很多种授权方式,OAuth2,JWT等等,你也可以去试试。

有些地方可能说的不是特别准确

在体验与安全上,找个平衡的方案吧。JWT目前很流行,安全性相对高些。

如果只是内网使用,除非黑客破解你wifi,做伪基站中间人劫持cookie。

这只是协议上的问题,关心代码的安全性更好吧。。。

补充:cookie被劫持的话。。。可以加过期时间(过期就重新登录),或记录登录ip,及时通知用户有异地操作。。。

最好的办法HTTPS + 受信证书 + SessionID开启HttpOnly + 敏感操作短信/邮箱验证。

  1. 可信的HTTPS可以保证传输过程中数据是安全的
  2. HttpOnly可以保证浏览器不能操作Cookie中的SID
  3. 短信/邮箱验证保证最后一道安全防线(即使被会话伪造也能保证安全)

U盾知道吧 类似这种电子狗 身份令牌 够安全了吧 丢了一样被人盗用啊
所以sessionid的方式的安全性是有一定前提的 最安全就是敏感操作需要授权认证且不保留认证状态

IP肯定不行。假设我连着移动网络,走一段换了个基站,我的IP就跟能变的。难道用户一边走一边重新登陆? 而且在一个外网ip的内网内,每个人的出口IP都一样的,一样达不到目的。

只能说,没有绝对的安全

有点像“两军问题

宣传栏