如果我收到对 url host.com/site-directory/page-slug.html?session={someValidNonExpiredSessionGuid}
的请求,并且我检测到 session cookie 的值为: {someOtherValidNonExpiredSessionGuid}
,然后
哪个 session 是与请求关联的正确 session ?
这是一些背景:
我用于跨 HTTP 请求维护状态的模式是在查询字符串、表单集合和/或 cookie 中存储唯一 ID。然后,在每个请求中,我从数据库表中找到唯一的 ID 和提取日期。如果 ID 无效,或者 session 已过期,将创建一个新 session (使用新 ID、新 Cookie 等)。
默认行为是所有表单都有一个字段:
<input type="hidden" name="session" value="{someGuid}" />
所有指向站点上其他页面的链接都将附加一个查询字符串参数
<a href="site-directory/page-slug.html?session={someGuid}">a sample link</a>
并且,如果用户的浏览设备支持 cookie,将设置一个具有 session 值的 cookie。
如果我已验证用户的浏览设备支持 cookie,那么我的表单和查询字符串将不再需要 session ID 字段/参数。
但是,在决定查询字符串的 session 参数是否应优先于 cookie 值或反之亦然时,我遇到了一个概念性问题。似乎在任何一种情况下我都可能获得不良数据。如果用户使用包含在 URL 中的 session 参数为页面添加了书签,我可能会使用错误的查询字符串参数获取数据。如果用户在没有终止 session 的情况下关闭浏览器,并且 session 过期窗口尚未关闭,我也可能从 cookie 中获取错误数据。这两个选项似乎也容易受到恶意用户的攻击,他们会拦截请求并发送具有相同 session 信息的请求。
所以,再一次,我的问题是
如果我收到对 url host.com/site-directory/page-slug.html?session={someValidNonExpiredSessionGuid}
的请求,并且我检测到 session cookie 的值为: {someOtherValidNonExpiredSessionGuid}
,然后哪个 session 是与请求关联的正确 session ?
我倾向于 cookie session ,因为看起来最常见的情况是包含 session 的书签。我已经决定表单发布数据应该具有最高优先级,因为页面将始终使用正确的 ID 呈现表单,并且唯一可能出现错误、未过期 ID 的情况是快速实现 XSS 攻击,这是通过包含一个请求范围的防伪标记字段来规避的。
除了主要问题之外,我感谢任何对我在此描述中表达的任何安全相关或逻辑疏忽的见解。我为这篇冗长的帖子道歉,但我觉得有必要解释一下情况。非常感谢您的意见。
此外,它不一定与问题相关,但我在大多数情况下使用 ASP.NET MVC,并使用 Response.Cookies
手动设置我的 cookie。
最佳答案
从安全的角度来看, session 不应存储在查询字符串中。
例如: 如果 session 存储在查询中,并且您在同一页面上链接到远程主机,则用户有效 session 可以通过引用 header 发送到远程主机。
session 应始终存储在 cookie 中。
关于asp.net-mvc - QueryString 中的 SessionID 还是 GET 请求中的 Cookie 优先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476049/