问一个关于 django 中 session id 的安全性问题

2017-02-14 22:16:46 +08:00
 AyoCross
今天重看 session 和 cookie 两种缓存的关系,有一个疑问: session id 既然是保存在 cookie 里,那么如果 cookie 被截取, session id 不也一起有了,那 session 还如何保证其安全性呢。

在网上也没找到一个靠谱的答案,在 Q 群里问了下,有大神回答说是因为:是被非对称加密的,没有私钥是解不出来。。感觉听完还是云里雾里的,不是特别懂。。情人节的夜晚,有没有老司机来帮忙解答下,如果能通俗点就更好了

谢谢
3430 次点击
所在节点    Python
10 条回复
ryd994
2017-02-14 22:38:54 +08:00
1.session 只有 id 在 cookie 里。确实能通过偷 cookie 的方式偷 session ,但是客户端永远看不见 session 的具体内容。而 cookiesession 是可以看见的。一般会签名,避免客户端篡改。也有加密的。但是 session 内容毕竟是存在客户端,不符合安全原则。
2. cookie session 大小有限制,而且会产生很多不必要的流量。因为浏览器每个请求都会发送所有 cookie 。
WildCat
2017-02-14 22:44:37 +08:00
@ryd994 rails 的 session 默認存儲在 cookie 裏,但是有加密的
weyou
2017-02-14 22:49:28 +08:00
django 的 session id 就是一个随机 id 。防止 csrf 攻击的是另外一个叫做 csrf_token (具体什么名字有点忘了)的自定义 http header 来保证的。
murmur
2017-02-14 22:51:06 +08:00
问的好
所以有两种方法
( 1 ) https ,这要都被偷听了要检讨你网络得多烂了
( 2 )类似 oauth ,用户会用一个私钥 hash 所有的参数,他可以拿到 cookies 但是拿不到用户的私钥,自然也不能每次都计算出 hash
z4none
2017-02-14 22:53:23 +08:00
要保证安全性,
1 是避免 cookie 被截取,设置 cookie 的 secure flag ,使其只在 HTTPS 连接中传输
2 敏感操作再次验证用户帐号密码
eric6356
2017-02-14 22:53:28 +08:00
不知道你说的 cookie 被截取具指什么。
因为 Django 的 session cookie 默认是 HTTPOnly 的,所以普通的 XSS 偷 cookie 很难奏效。
https://docs.djangoproject.com/en/1.10/ref/settings/#session-cookie-httponly
sujin190
2017-02-14 22:57:52 +08:00
确实存在获得 sessionid 就能拥有登陆状态这个问题,会话劫持,但 session 里边的内容是不可能知道的,防止劫持也可以有很多方案,比如浏览器的跨域,比如 HTTPOnly 可以防止浏览器本地被修改,比如 https 可以防止传输过程中窃取,比如没过一段时间刷新成新的 id 等等
AyoCross
2017-02-14 23:19:59 +08:00
@ryd994 谢谢,对于这个概念明朗了许多
ansheng
2017-02-15 12:59:50 +08:00
1. 你确实可以通过拿到 cookieid 来获取到 sessionid
2. 就算你拿到了, session 数据存储到服务端,而且大部分都是内网的,你怎么去获取吗?
AyoCross
2017-02-15 19:29:22 +08:00
@ansheng 我的理解:并不是为了获取 session 里的数据,而且通过伪造身份来提高权限,比如未登录的用户伪造登录或者伪造管理员权限。来对网站做出一些损害

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

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

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

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

© 2021 V2EX