CSRF 保护

Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。

无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,以便CSRF保护中间件可以验证该请求, 您可以使用 Blade指令来生成令牌字段:

包含在 web 中间件组里的 VerifyCsrfToken 中间件 会自动验证请求里的令牌是否与存储在会话中令牌匹配。

CSRF 令牌 & JavaScript

构建由 Javascript 驱动的应用时,可以很方便地让 Javascript HTTP 函数库在发起每一个请求时自动附上 CSRF 令牌。默认情况下, resources/assets/js/bootstrap.js 文件会用 Axios HTTP 函数库注册的 csrf-token meta 标签中的值。如果你不使用这个函数库,你需要手动为你的应用配置此行为。

有时候你可能希望设置一组并不需要 CSRF 保护的 URI。例如,如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统,你会需要从 CSRF 的保护中排除 Stripe Webhook 处理程序路由,因为 Stripe 并不会给你的路由发送 CSRF 令牌。

你可以把这类路由放到 routes/web.php 外,因为 RouteServiceProvider 的 中间件适用于该文件中的所有路由。不过,你也可以通过将这类 URI 添加到 VerifyCsrfToken 中间件中的 $except 属性来排除对这类路由的 CSRF 保护:

然后,一旦创建了 标记,就可以指示像 jQuery 的库自动将令牌添加到所有请求的头信息中。这可以为基于 AJAX 的应用提供简单、方便的 CSRF 保护:

Laravel 将当前的 CSRF 令牌存储在一个 XSRF-TOKEN cookie 中,该cookie 包含在框架生成的每个响应中。 您可以使用 cookie 值来设置 X-XSRF-TOKEN 请求标头。

本文章首发在 网站上。