CSRF 保护有多种方法。

传统方式(“同步器令牌”模式)通常涉及为每个请求设置唯一的有效令牌值,然后在随后发送请求时验证该唯一值。通常通过设置隐藏表单字段来完成。令牌值通常是短暂的并与该会话相关联,因此如果黑客尝试重用他们之前在页面上看到的值,或者尝试猜测该值,他们可能会失败。因此,只有来自您的应用程序的请求才有效,来自应用程序/域外部的伪造请求(也称为跨站点请求伪造)将会失败。

其缺点是它要求您的应用程序在所有 HTML 表单上设置此隐藏令牌。这些页面现在必须由应用程序动态生成,而以前它们可能是静态 HTML。它还可能会破坏后退按钮(因为您需要刷新表单以重新生成另一个唯一的 CSRF 值)。您现在还需要跟踪服务器端的有效令牌并检查任何使用有效令牌的请求。这可能需要相当多的额外努力来实施和维护。

另一种方法(称为“Cookie 到标头令牌”模式)是每个会话设置一次 Cookie,然后让 JavaScript 读取该 Cookie 并使用该值设置自定义 HTTP 标头(通常称为或X-CSRF-TOKEN)。任何请求都会发送标头(由 Javascript 设置)和 cookie(由浏览器设置为标准 HTTP 标头),然后服务器可以检查X-XSRF-TOKENXSRF-TOKENX-CSRF-TOKENheader 与 cookie 标头中的值匹配。这个想法是,只有在同一域上运行的 JavaScript 才能访问 cookie,因此来自另一个域的 JavaScript 无法将此标头设置为正确的值(假设该页面不易受到允许访问此 cookie 的 XSS 攻击) 。即使是假链接(例如在网络钓鱼电子邮件中)也不起作用,因为即使它们看起来来自正确的域,也只会设置 cookie 而不会设置标头X-CSRF-TOKEN

这比 Synchronizer 令牌模式更容易实现,因为您不需要为每个表单的每次调用设置令牌,并且检查也相对简单(只需检查 cookie 与标头匹配)而不是跟踪 CSRF 令牌有效性。您所需要做的就是为每个会话将 cookie 设置为随机值。一些前端框架甚至会在看到 cookie 时自动为您生成标头(例如AngularJS 就是这样做的)。

缺点是它需要 JavaScript 才能工作(但如果你的应用程序基本上没有 JavaScript 就无法工作,那么这可能不是问题),而且它只适用于 JavaScript 发出的请求(例如 XHR 请求) - 常规 HTML 表单请求不会设置标题。对此的一种变体(“双重提交 Cookie”模式)将X-CSRF-TOKEN值放在隐藏的表单字段中,而不是放在 HTTP 标头中,以解决此问题,但仍然使服务器端逻辑比传统的 Synchronizer 令牌模式更简单。但应该注意的是,当攻击者能够设置 cookie(通常比读取 cookie 更容易)时,OWASP 指出了 Double Submit 方法的一些弱点,因此建议在这种情况下验证 CSRF 令牌。

此外,同步器令牌模式可以允许额外的控制来强制执行流程(例如,仅当应用程序认为您已发送有效请求以获取该表单时,才会设置隐藏字段 CSRF 令牌)。

哦,一些安全扫描会发现 cookie 没有设置标志,HTTP-Only因此可以由 JavaScript 读取——但这是故意的,因为它需要能够读取它!错误警报。您可能会认为只要您使用通用名称,X-CSRF-TOKEN他们就会知道不要标记此名称,但经常看到它被标记。

 

所有这些都是为了跨站点请求伪造保护,当向后端发送请求时,您只需要使用其中之一。不同的名称来自不同的框架。

这都是关于csrf value向后端发送一个。然后后端会将其与该特定用户的数据库中存储的 csrf 值进行比较。


CSRF:

  • 用于 HTML 表单(不是 AJAX
  • 在渲染 HTML 表单时在后端生成。
  • 我们无法直接在 HTML 表单中设置请求标头,因此我们必须通过表单输入将其作为隐藏字段发送。
  • 您可以随意命名此隐藏输入。
    例如:<input name="my_csrf_input" value="a_hashed_string(the csrf value)"

X-CSRF-token:

  • 它被添加到 AJAX 请求的请求HTTP 标头中。
  • 要使用它,我们可以在渲染 HTML 时将 放入标签中,然后在前端我们可以从该标签获取值csrf value并将其发送到后端。<meta><meta>

Laravel 具体:

  • 使用Laravel作为后端时。Laravel 自动检查此标头并将其与csrf value数据库中的有效标头进行比较(Laravel 有一个中间件用于此目的)。

X-XSRF-token:

  • 它被添加到 AJAX 请求的请求标头中。
  • AngularAxios等流行的库会自动从 cookie 中获取此标头的值XSRF-TOKEN并将其放入每个请求标头中。
  • 要使用它,我们应该在后端创建一个名为cookieXSRF-TOKEN,然后我们使用 Angular 或 Axios 的前端框架将自动使用它。

Laravel 具体:

  • 因为它很受欢迎,Laravel 在每个响应中创建这个 cookie。
  • 因此,当您使用 Axios 和 Laravel 时,您不需要执行任何操作,只需登录用户,“auth”中间件就会完成这项工作。
  • 相比之下,它是一个更大的字符串,X-CSRF-Token因为 cookie 在 Laravel 中是加密的。

CSRF 和 X-CSRF-Token 的区别
标签: