X-XSRF-TOKEN和X-CSRF-TOKEN之间有什么区别



当使用隐藏字段以及使用标头时,为什么?
X-XSRF_TOKEN使用时?
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请求的请求标题
  • 要使用它,我们可以在呈现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。
  • 因此,当您使用axiosangular的CC_12时,您无需做任何事情。只需记录用户," auth"中间件将完成工作。
  • 在Laravel中,与x-csrf-token相比,它是一个更大的字符串

当您使用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 Doc中删除,但您可以在Laravel 5.0 Doc中找到它,链接在这里

要添加到已经提供的出色答案中,值得注意的是,术语CSRF和XSRF是可以互换的。

据信,跨站点伪造最初被称为XSRF,其中" X"代表交叉(1),或遵循跨站点脚本(XS)中使用的模式,避免与CSS(2)混淆。

随着时间的流逝,某些框架使用了" XSRF"。要通过XHR参考保护,而" CSRF"用于通过HTML表单进行保护(请参阅此页面上的其他答案)。

但是," CSRF"如今已成为更常用的术语。

最新更新