会话 ID 放置:表单隐藏字段与 HTTPOnly Cookie

aLo*_*der 2 security cookies xss session csrf

将会话 ID 放置在隐藏表单输入与 cookie 中的优缺点是什么?

将 CSRF-Tag 放在隐藏的表单输入字段中并将会话 ID 放在 httpOnly cookie 中是否正确?哪个更安全?

Sil*_*Fox 5

如果您将 Session ID 放在隐藏的表单字段中,那会更加安全,但它可能会妨碍用户体验。

原因是这会从本质上保护您免受CSRF 的侵害,因为向您的站点发出的任何跨域请求都意味着浏览器不会自动包含使 CSRF 攻击成为可能的会话标识符。它还可以消除会话固定攻击,因为没有 cookie 可以中毒。此外,任何登录 CSRF也已死在水中。

要实现这一点,您需要通过 POST 方法对站点上的所有操作(包括导航)进行操作。GET 方法不合适,因为这会在浏览器历史记录中、默认情况下在任何代理或服务器日志中公开会话标识符,并且还可能通过referer标头泄漏。

例如,

<form method="post" action="/executeAction">

  <input type="hidden" name="sessionId" value="12345678901234567890" />
  <input type="hidden" name="action" value="navigateToAccountStatus" />

</form>
Run Code Online (Sandbox Code Playgroud)

请注意,这将阻止在用户重新提交表单的情况下使用后退按钮(如果该操作不是安全操作,这可能会很危险)。为了防止这种情况,您可以在处理每个操作后刷新会话标识符。

另一个原因是这将保护您的站点免受诸如POODLE 之类的攻击。由于没有 cookie 可供中间人一次暴力破解一个字节,因此 POODLE 攻击将是徒劳的。

请注意,这种方法更难实现,并且没有多少 web 框架默认支持它。

将 CSRF-Tag 放在表单隐藏字段和 httpOnly cookie 中的会话 ID 中是否正确?

是的,这是大多数网站采用的方法。对于大多数用途来说,它“足够安全”——只有非常高安全性的系统(如网上银行)才应采用这种形式方法。

  • 谢谢你。这是非常有帮助的。我完全迷失在网络上太多的会话管理方法中。 (2认同)