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

Kis*_*ade 13 php security csrf laravel-5.2

当使用隐藏字段和使用标题时为什么?
X-XSRF_TOKEN我们什么时候用?
X-CSRF TOKEN我们什么时候用?

Ahm*_*aki 26

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

这一切都是关于发送csrf value到后端。然后后端将它与存储在数据库中的特定用户的 csrf 值进行比较,如果匹配,它将允许处理请求。

csrf :

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

x-csrf-令牌:

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

Laravel 具体:

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

x-xsrf-令牌:

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

Laravel 具体:

  • 因为它很流行,laravel 在每个响应中都会创建这个 cookie。
  • 所以当你使用 exampleaxiosangularwith 时laravel,你不需要做任何事情。只需登录用户,'auth' 中间件就可以完成这项工作。
  • 在 laravel 中,它是一个更大的字符串,x-csrf-token因为 cookie 在 laravel 中是加密的。

  • 值得一提的是,Laravel CSRF 中间件(`\App\Http\Middleware\VerifyCsrfToken`)仅针对“web”应用程序启用。如果您使用 laravel 作为 `api`(REST API),Laravel **将不会运行此中间件**,正如您在 `App\Http\Kernel` 类中看到的那样。 (2认同)

小智 8

当您使用ajax提交数据时,您将需要CSRF令牌的标头,因为ajax不会将令牌与数据一起发送.

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

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

但是你必须为每个ajax请求添加隐藏字段.

X-CSRF-TOKEN和X-XSRF-TOKEN之间的区别在于第一个使用纯文本值而后者使用加密值,因为Laravel中的cookie始终是加密的.如果使用csrf_token()函数提供标记值,则可能需要使用X-CSRF-TOKEN标头.

它在laravel 5.2 doc中删除但你可以在laravel 5.0 doc中找到它,链接就在这里

  • 它已添加回5.4 https://laravel.com/docs/5.4/csrf#csrf-x-xsrf-token (2认同)