【发布时间】:2011-07-25 11:10:58
【问题描述】:
如果我收到对 url host.com/site-directory/page-slug.html?session={someValidNonExpiredSessionGuid} 的请求,并且我检测到会话 cookie 的值是:{someOtherValidNonExpiredSessionGuid},那么
哪个会话是与请求关联的正确会话?
这里有一些背景:
我用于跨 HTTP 请求维护状态的模式是在查询字符串、表单集合和/或 cookie 中存储唯一 ID。然后,在每个请求中,我都会找到唯一的 ID 并从数据库表中提取日期。如果 id 无效,或者会话过期,将创建一个新会话(使用新 id、新 cookie 等)。
默认行为是所有表单都有一个字段:
<input type="hidden" name="session" value="{someGuid}" />
网站上其他页面的所有链接都将附加一个查询字符串参数
<a href="site-directory/page-slug.html?session={someGuid}">a sample link</a>
而且,如果用户的浏览设备支持 cookie,则会设置一个具有会话值的 cookie。
如果我已验证用户的浏览设备支持 cookie,那么我的表单和查询字符串将不再需要会话 ID 字段/参数。
但是,在决定查询字符串的会话参数是否应优先于 cookie 值或反之亦然时,我遇到了一个概念性问题。似乎在任何一种情况下我都可能获得不良数据。如果用户使用 URL 中包含的会话参数为页面添加书签,我可以获得带有错误查询字符串参数的数据。如果用户在没有终止会话的情况下关闭浏览器,并且会话过期窗口尚未关闭,我也可能从 cookie 中获取错误数据。似乎这两个选项都容易受到恶意用户拦截请求并发送具有相同会话信息的请求的攻击。
所以,再一次,我的问题是
如果我收到对 url host.com/site-directory/page-slug.html?session={someValidNonExpiredSessionGuid} 的请求,并且我检测到会话 cookie 的值为:{someOtherValidNonExpiredSessionGuid},那么 哪个会话是与请求关联的正确会话?
我倾向于使用 cookie 会话,因为似乎最常见的场景是包含会话的书签。我已经决定表单发布数据应该具有最大的优先级,因为页面总是会使用正确的 ID 呈现表单,而唯一可能出现错误、未过期 ID 的情况是非常快速实施的 XSS 攻击,这可以通过包含请求范围的防伪令牌字段来规避。
除了主要问题之外,我感谢我在此描述中表达的任何与安全相关或逻辑疏忽的见解。我为这篇长篇博文道歉,但觉得有必要解释一下情况。非常感谢您的意见。
此外,它不一定与问题相关,但我在大多数情况下使用 ASP.NET MVC,并使用 Response.Cookies 手动设置我的 cookie。
【问题讨论】:
-
我很困惑。为什么你意识到这么难的解决方案?您使用什么会话状态存储:inproce、memcache、db 或其他?
-
@Antony Blazer,使用 ASP.NET 的 SessionState 是一个实现细节。我的问题是概念性的,适用于任何 HTTP 应用程序。
标签: asp.net-mvc http session security httprequest