security - session ID 放置 : Form Hidden Field vs. HTTPOnly Cookie

标签 security session cookies xss csrf

与 cookie 相比,将 session ID 置于隐藏表单输入中有哪些优点和缺点?

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

最佳答案

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

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

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

例如,

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

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

</form>

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

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

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

Is it correct to put CSRF-Tag in form hidden field and Session Id in httpOnly cookie?

是的,这是大多数网站采用的方法。对于大多数用途来说,它“足够安全”——只有像网上银行这样安全性非常高的系统才应该采用表单方法。

关于security - session ID 放置 : Form Hidden Field vs. HTTPOnly Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012422/

相关文章:

javascript - 防止攻击者获取系统的用户名

java - 在Spring中动态创建Bean

jquery - session 超时是否在每个请求时重置

java - hibernate - session 已关闭

javascript - 您如何将 XMPP 绑定(bind) session 镜像到多个选项卡或窗口(如 facebook、okCupid 等)

javascript - 是否可以使用 javascript 启用 chrome 或 firefox 等浏览器的 cookie?

sql-server - SQL Server 用户与角色

java - Java中如何限制开发者使用反射访问私有(private)方法和构造函数?

apache - 设置 Apache IP 白名单

java - HttpURLConnection 在 Android 上的哪里存储 session ID cookie?