当使用隐藏字段以及使用标头时,为什么?
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。
- 因此,当您使用
axios
或angular
的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"如今已成为更常用的术语。