X-XSRF-TOKEN和X-CSRF-TOKEN有什么区别?

57

何时使用隐藏字段,何时使用标头?为什么?
什么情况下使用X-XSRF_TOKEN
什么情况下使用X-CSRF TOKEN


2
可能是CSRF和X-CSRF-Token之间的区别的重复问题。 - Óscar Andreu
3个回答

41

它们都是用于跨站请求伪造保护的,在向后端发送请求时只需要使用其中一个。不同的名称来自不同的框架。

这与向后端发送 csrf 值 有关。然后后端将其与数据库中存储的特定用户的csrf值进行比较,如果匹配,则允许处理该请求。

csrf :

  • 用于html表单(非ajax)
  • 在渲染html表单时由后端生成。
  • 我们不能直接在html表单中设置请求头,因此一种简单的方法是通过表单输入作为隐藏字段发送。
  • 您可以随意命名此隐藏输入字段。例如 <input name="my_csrf_input" value="a_hashed_string_the_csrf_value"

x-csrf-token:

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

Laravel 特定:

  • 当使用laravel作为后端时,Laravel会自动检查这个头部并将其与数据库中的有效csrf值进行比较。(laravel已有一个中间件来处理这个问题)

x-xsrf-token:

  • 在Ajax请求的头部中添加了它。
  • 像angular和axios这样的流行库会自动从xsrf-token cookie获取此头的值并将其放入每个请求的头中。
  • 要使用它,我们应该在后端创建一个名为xsrf-token的Cookie,然后使用angular或axios的前端框架将自动使用它。

Laravel 特定:

  • 因为它很受欢迎,laravel会在每个响应中创建此cookie。
  • 所以当你使用例如axiosangularlaravel时,你什么也不需要做。只需登录用户,'auth'中间件就会完成任务。
  • 在laravel中,与x-csrf-token相比,它是一个更大的字符串,因为在laravel中加密了cookie。

2
值得一提的是,Laravel CSRF 中间件(\App\Http\Middleware\VerifyCsrfToken)仅适用于 web 应用程序。如果您将 Laravel 用作 api(REST API),Laravel 将不会运行此中间件,正如您在 App\Http\Kernel 类中所看到的。 - Wesley Gonçalves

17

当您使用ajax提交数据时,您需要为CSRF令牌添加头部,因为ajax不会将令牌与数据一起发送。

您可以使用以下代码为ajax请求使用隐藏字段

$.ajaxSetup(
{
    headers:
    {
        'X-CSRF-Token': $('input[name="_token"]').val()
    }
});

但你需要为每个ajax请求添加隐藏字段。

X-CSRF-TOKEN和X-XSRF-TOKEN之间的区别在于前者使用明文值,后者使用加密值,因为Laravel中的cookie始终是加密的。如果您使用csrf_token()函数提供令牌值,则可能希望使用X-CSRF-TOKEN标头。

它已在Laravel 5.2文档中删除,但您可以在Laravel 5.0文档中找到它,链接在这里


1

除了已经提供的出色答案之外,值得注意的是CSRF和XSRF这两个术语是可以互换使用的。

据信,跨站请求伪造最初被称为XSRF,其中“X”代表Cross(1),或者它遵循在跨站脚本攻击(XSS)中使用的模式,避免与CSS(2)混淆。

随着时间的推移,一些框架已经使用“XSRF”来指代通过XHR进行保护,而“CSRF”则用于通过HTML表单进行保护(请参见本页面上的其他答案)。

然而,“CSRF”现在已成为更常用的术语。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接