【问题标题】:what is the difference between X-XSRF-TOKEN and X-CSRF-TOKEN?X-XSRF-TOKEN 和 X-CSRF-TOKEN 有什么区别?
【发布时间】:2017-07-13 11:41:51
【问题描述】:

什么时候使用隐藏字段,什么时候使用header,为什么?
X-XSRF_TOKEN什么时候用?
X-CSRF TOKEN什么时候用?

【问题讨论】:

标签: php security laravel-5.2 csrf


【解决方案1】:

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

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

csrf:

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

x-csrf-token:

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

特定于 Laravel:

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

x-xsrf-token:

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

特定于 Laravel:

  • 因为很受欢迎,laravel 在每个响应中创建这个 cookie。
  • 所以当你使用axiosangularlaravel 时,你不需要做任何事情。只需登录用户,“auth”中间件就可以完成这项工作。
  • 在 laravel 中,它比 x-csrf-token 更大,因为 cookie 在 laravel 中是加密的。

【讨论】:

  • 值得一提的是,Laravel CSRF 中间件 (\App\Http\Middleware\VerifyCsrfToken) 仅对 web 应用程序启用。如果您将 laravel 用作 api (REST API),Laravel 将不会运行此中间件,如您在 App\Http\Kernel 类中所见。
【解决方案2】:

当您使用 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 文档中找到它,链接是 here

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 2018-02-12
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2015-09-13
    相关资源
    最近更新 更多