CSRF token

Posted WEB漏洞挖掘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF token相关的知识,希望对你有一定的参考价值。

在本节中,我们将解释什么是CSRF token,它们如何防止CSRF攻击,以及应该如何生成和验证CSRF token。

1. 什么是CSRF token?

CSRF token是由服务器端应用程序生成的唯一的、秘密的、不可预测的值,发送到客户端,并在客户端随后发起的请求中包含该token。服务器端应用程序验证请求是否包含预期的 token,如果 token缺失或无效,则拒绝请求。

CSRF token可以防止CSRF攻击,因为攻击者无法构造一个完全有效的HTTP请求来提供给受害用户。因为攻击者不能确定或预测用户的CSRF token的值,所以他们不能构造一个具有应用程序响应请求所需的所有参数的请求。

2. CSRF token应该如何生成?

CSRF token应该包含显著的熵,并且具有与一般会话 token相同的属性,具有很强的不可预测性。

你应该使用伪随机数生成器(PRNG),创建它时加入时间戳,再加上一个静态密文。

如果你需要超越PRNG强度的进一步保证,你可以通过将其输出与某些用户特定的熵连接起来,并对整个结构进行强散列,从而生成单个 token。这对试图分析 token的攻击者来说是一个额外的障碍。

3. CSRF token应该如何传输?

CSRF token应该被视为机密,并在其整个生命周期中以安全的方式进行处理。通常有效的一种方法是在使用POST方法提交的html表单的隐藏字段中将 token传递给客户端。当表单提交时, token将作为请求参数包含:

<input type="hidden" name="csrf-token" value="CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz" /> 

为了额外的安全性,应该尽早将包含CSRF token的字段放置在HTML文档中,理想情况下是在任何非隐藏的输入字段之前,以及在HTML中嵌入用户可控数据的任何位置之前。这减少了攻击者使用各种技术来操纵HTML文档并捕获其内容的一部分。

另一种将 token放入URL查询字符串的替代方法有点不安全,因为查询字符串:

  • 被记录在客户端和服务器端的不同位置;

  • 易于在HTTP Referer头内传输给第三方;

  • 可以在用户浏览器的屏幕上显示。

有些应用程序在自定义的请求头中传输CSRF token。由于浏览器通常不允许跨域发送自定义标头,因此这对设法预测或捕获另一个用户的 token的攻击者提供了进一步的防御。但是,这种方法限制了应用程序使用XHR(而不是HTML表单)发出受csrf保护的请求,在许多情况下可能会被认为过于复杂。

CSRF token不应该在cookie中传输。

4. 如何验证CSRF token?

生成CSRF token时,它应该存储在服务器端用户会话数据中。当接收到需要验证的后续请求时,服务器端应用程序应该验证请求包含一个 token,该 token与存储在用户会话中的值匹配。无论请求的HTTP方法或内容类型是什么,都必须执行此验证。如果请求根本不包含任何 token,则应以与存在无效 token时相同的方式拒绝该请求。


以上是关于CSRF token的主要内容,如果未能解决你的问题,请参考以下文章

从Java代码实现角度探讨CSRF(采用全局的token)

csrf token 跟进

CSRF Failed: CSRF token missing or incorrect.

nodejs.ForbiddenError: invalid csrf token解决方案

csrf_token的了解

csrf_token的了解