已经实施 csrf 保护时使用会话 id 的目的是啥?

Posted

技术标签:

【中文标题】已经实施 csrf 保护时使用会话 id 的目的是啥?【英文标题】:What is the purpose of using a session id when csrf protection is already implemented?已经实施 csrf 保护时使用会话 id 的目的是什么? 【发布时间】:2015-01-15 12:02:58 【问题描述】:

我知道要保护 Web 应用程序免受跨站请求伪造,唯一安全的方法是实现 CSRF 令牌。我的问题是,是否也可以使用 CSRF 令牌来跟踪会话?为什么我们要实现不同的会话 ID 来跟踪会话?

【问题讨论】:

【参考方案1】:

CSRF 令牌是一个必须随机生成并与 EVERY GET 中的会话(用户)相关联的值,它显示了防止错误 POST 的表单。这个错误的 POST 也来自用户浏览器,因此,要对 POST 进行身份验证,您需要与存储在服务器内存中的令牌进行会话,以比较 POST 附带的令牌是否与用户会话中存储的相同。

此外,Web 应用程序需要在 GET 中识别用户,而 CSRF 令牌仅在 POST 中。

由于 HTTP 的断开连接性质,会话需要是静态的,以便随着时间和多个请求识别用户。 CSRF 在每次 GET 中都会发生变化,它不能像 session 一样使用。

另一方面。你的想法应该用什么服务器?每次 GET 创建一个新会话并将所有以前的会话数据复制到新会话?这太疯狂了。

看看蒙大拿州立大学的this pdf。它有助于我理解 CSRF。

【讨论】:

"CSRF 令牌仅在 POST 中" 错误!我认为您对 csrf 令牌的整个想法是错误的。 简短回答:会话需要是静态的,才能随着时间的推移识别用户。 CSRF 在每个 GET 中都会发生变化,所以如果您重复 CSRF 令牌以像会话一样使用它们,那么您做错了。 据我了解,CSRF 令牌可以通过 url 或 POST 正文内容发送。为了安全起见,我们使用 POST。但这不是问题。我们不能简单地使用 CSRF 令牌作为会话标识符吗?即使它们是随机字符,服务器仍然知道它在特定会话仪式中对用户的价值吗?这些信息不能用于会话识别吗? @jlvaquero 您可以在 cookie 中发送 CSRF 令牌以使用 ajax get。不仅在 POST 中使用 CSRF 有很多方法 @Anonymous Platypus 但如果您每次生成新的 CSRF 令牌时都将会话信息存储在服务器端(RAM 内存、redis 等),那么您就是在创建一个新的会话 ID。因此,您必须将所有这些信息移至新会话。由于您在 Web 应用程序生命周期中生成了大量 CSRF 令牌,因此这不是一个好主意。

以上是关于已经实施 csrf 保护时使用会话 id 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

没有会话或数据库的安全 CSRF 保护?

使用会话令牌实现 CSRF 保护

Laravel CSRF 保护

是否有必要保护 JAX-RS 请求免受 CSRF 影响?

公开会话的 CSRF 保护令牌是不是安全?

何时需要使用令牌保护表单(CSRF 攻击)?