asp.net-mvc - QueryString 中的 SessionID 还是 GET 请求中的 Cookie 优先?

标签 asp.net-mvc http session security httprequest

如果我收到对 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/

相关文章:

c# - 在 ASP.NET MVC5 上设置值后,静态属性在每个请求中始终为 null

asp.net-mvc - 如何使用 jQuery Ajax 和 ASP.NET MVC 更新页面内容?

json - 使用REST分页资源的正确方法是什么

security - flask: session 生命周期

php - 为什么在php中通过ajax请求时session id会改变?

session - 玩框架如何调和Stateless与Session和Cache

javascript - 如何在回发窗口中显示 ViewData 的内容?

c# - 将从 ToString ("MMMM") 返回的月份名称更改为自己的名称

javascript - XML-RPC Javascript 不支持的方法 ('OPTIONS' )

c# - 为什么 InProc session 模式不需要序列化