几个月前,我参观了一个安全研讨会,我们讨论了使用cookie进行会话管理时的一些安全问题。 有人告诉我,饼干原本不是为处理会话而设计的。 但是应该怎么做呢?
答案 0 :(得分:2)
这样做的一种安全方法是生成一个加密随机128位值(即CSPRNG生成的随机值),然后将其作为POST数据传递给每个页面。
e.g。
<form method="post" action="/globalHandler">
<input type="hidden" name="sessionId" value="<sessiontoken>" />
<input type="hidden" name="page" value="accountDetails" />
</form>
优点是会话标识符永远不需要在cookie中传输,减轻了POODLE或BREACH等SSL攻击(攻击者无法注入请求,因为他们没有会话标识符)。这本身也可以防止CSRF攻击。
缺点是登录时要访问的每个页面都只需要通过POST方法访问,其中可以在sessionId
参数上进行适当的验证。因此,最好在网站首次开发时使用,而不是更改现有网站以适应此格式。
使用POST数据比GET更安全,因为使用GET时,详细信息将位于URL的查询字符串部分中。 e.g。
https://example.com?sessionId=1234...
这不仅使会话标识符在用户屏幕上可见,而且还可以通过referer标头泄露,并且默认情况下也会在浏览器历史记录,代理和服务器日志中记录。默认情况下很少记录POST数据。
有些银行使用此方法确保用户在会话期间只有一条活动路径 - 会话标识符可以轻松轮换,这样,如果用户关闭不同的路径,则其标识符不匹配,并且退出了。当您具有必须按设定顺序执行的多步骤过程时,从安全角度来看,这很有用。当用户采用与开发人员期望不同的路径时,可能会出现一些业务逻辑漏洞。
答案 1 :(得分:1)
Cookie仍然是会话管理的最佳方式。请注意cookie的局限性。为了获得更好的结果,请使用无法通过http传输的Secure Cookies,仅使用https。例如,如果页面上存在对不安全图像的引用,则更难以意外泄漏。