【发布时间】:2017-07-13 11:41:51
【问题描述】:
什么时候使用隐藏字段,什么时候使用header,为什么?X-XSRF_TOKEN什么时候用?X-CSRF TOKEN什么时候用?
【问题讨论】:
标签: php security laravel-5.2 csrf
什么时候使用隐藏字段,什么时候使用header,为什么?X-XSRF_TOKEN什么时候用?X-CSRF TOKEN什么时候用?
【问题讨论】:
标签: php security laravel-5.2 csrf
所有这些都用于跨站点请求伪造保护,在向后端发送请求时,您只需使用其中一个。不同的名称来自不同的框架。
这一切都是为了向后端发送csrf value。然后后端会将它与存储在数据库中的特定用户的 csrf 值进行比较,如果匹配,它将允许处理请求。
csrf:
<input name="my_csrf_input" value="a_hashed_string_the_csrf_value"
x-csrf-token:
csrf value放在一个元标记中,然后在前端我们可以从该元标记中获取值并将其发送到后端。特定于 Laravel:
laravel 作为后端时。 Laravel 会自动检查此标头并将其与数据库中有效的csrf value 进行比较。(laravel 有一个中间件)x-xsrf-token:
axios 等流行库会自动从xsrf-token cookie 中获取此标头的值并将其放入每个请求标头中。xsrf-token的cookie,然后我们使用angular或axios的前端框架会自动使用它。特定于 Laravel:
axios 或angular 和laravel 时,你不需要做任何事情。只需登录用户,“auth”中间件就可以完成这项工作。x-csrf-token 更大,因为 cookie 在 laravel 中是加密的。【讨论】:
\App\Http\Middleware\VerifyCsrfToken) 仅对 web 应用程序启用。如果您将 laravel 用作 api (REST API),Laravel 将不会运行此中间件,如您在 App\Http\Kernel 类中所见。
当您使用 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
【讨论】: