美文网首页
Laravel 阅读:CSRF 保护

Laravel 阅读:CSRF 保护

作者: 晨曦入诗 | 来源:发表于2018-10-15 23:20 被阅读21次

简介


使用 Laravel 能够很简单的避免 跨站请求伪造(CSRF) 攻击。跨站请求伪造是一种恶意攻击,通过这种操作,认证用户可以执行未经授权的命令。
Laravel 为每个为用户回话自动生成 CSRF 令牌。此令牌用于验证认证用户就是实际向应用程序发出请求的用户。
在应用程序中凡是使用 HTML 表单的地方,都应该包含一个 _token 的隐藏域,这个字段值就是 CSRF 令牌,随请求发往后台的时候,会经 CSRF 中间件验证。咱们可以使用 csrf_field 辅助函数生成这个隐藏域。

<form method="POST" action="/profile">
       {{ csrf_field() }}
</form>

刚才提到的 CSRF 中间件,就是名为 VerifyCsrfToken 的中间件,位于 app\Http\Middleware\VerifyCsrfToken.php ,它定义在 web 中间件组里面,所以对所有的 Web 请求接口都生效。 VerifyCsrfToken 会验证请求里的令牌和保存在回话里的令牌是否一样。

CSRF 令牌 & JavaScript

在构建 JavaScript 驱动型的应用程序时,给你的 JavaScript HTTP 库附加 CSRF 令牌也很方便。默认, resources/assets/js/bootstrap.js 文件中为 Axios HTTP 库附加了 CSRF 令牌,令牌从 HTML 的 <meta name="csrf_token" content="{{ csrf_token() }}"> 这个标签里取到的。

/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf_token" ]');
if(token){
     window.axios.defaults.headers.commont(['X-CSRF-TOKEN']) = token.content;
} else {
     console.error('CSRF token not found :https://laravel-china.org/dosc/laravel/csrf#csrf-x-csrf-token');
}

如果你不是用 Axios 作为 HTTP 请求库的话(比如用 jQuery),那么就需要你自己动手配置了。

从 CSRF 保护中删除一组 URLs


应用程序中并不是所有的请求都需要经过 CSRF 令牌验证。例如,当你使用 Stripe 处理支付流程并且试用了它们的 wekhook 系统的时候,你就需要把所有与 Stripe 祥光的 URL 排除在 CSRF 保护队列之外,因为 Stripe 可不知道要给你的路由方式什么 CSRF 令牌值。
遇到这种情况,你的路由要么不放在 routes/web.php 中(因为这个文件里的路由都附加了 web 中间件),当然这很麻烦,所以我们不这么做。怎么做呢? 很简单,只需要在 VerifyCsrfToken 中间件的 $except 属性里添加你要排除在 CSRF那户之外的 URLs 就可以了。

<? php

namespace App\Http\Middleware;
use illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerirfCsrfToken extends BaseVerifier{
      /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
      protected $excerpt = [
           'stripe/*,
    ];
}

X-CSRF-TOKEN

VerifyCsrfToken 中间件除了会检查以 POST 参数形式传递过来的 URLs 令牌之外,也检查请求头的 X-CSRF-TOKEN 字段。我们可以把字段放在 meta 标签里:

<meta name="csrf-token" content="{{ csrf_token() }}">

这样一个 meta 标签创建好之后,我们就可以向 jQuery 这一类库中附加 X-CSRF-TOKEN 标头字段,之后每次 HTTP 请求都会包含这个信息:

$.ajaxSetup({
     headers:{
          'X-CSRF-TOKEN' : $('meta[ name = "csrf-token"]').attr('content)
     };
});

需要注意的是,在 resources/asset/js/bootstrap.js 这个文件中,默认为 Axios 这个 HTTP 请求库附加的 CSRF 令牌,也是从上面的 meta 标签里获得的。如果你不是用 Axios 作为 HTTP 请求库的话,就需要像上面 设置 jQuery 那样手动配置了。

X-XSRF-TOKEN


Laravel 还将应用程序的 CSRF 令牌保存在了名为 XSRF-TOKEN 的 cookie 里,这个 cookie 在程序的每次响应中都会携带。你可以用这个 cookie 设置 X-XSRF-TOKEN 请求头。
这个 cookie 主要是为其他一些 JavaScript 框架和库提供便利,比如 Angular 和 Axios ,它们会自动将这个名为 XSRF-TOKEN 的 cookie 值放在 X-XSRF-TOKEN 这个请求头里面。

相关文章

  • Laravel 阅读:CSRF 保护

    简介 使用 Laravel 能够很简单的避免 跨站请求伪造(CSRF) 攻击。跨站请求伪造是一种恶意攻击,通过这种...

  • 65. CSRF 保护

    使用 CSRF 保护 Laravel 可以轻松地保护应用程序免受 跨站请求伪造 (CSRF) 的攻击。 Larav...

  • laravel之CSRF保护

    跨站请求伪造是一种通过伪装授权用户的请求来利用授信网站的恶意漏洞 生成 表单隐藏 _token CSRF 保护中排...

  • Laravel上实现CSRF保护

    环境 Laravel5.4 什么是CSRF? 维基百科的解释如下:跨站请求伪造(英语:Cross-site req...

  • Laravel Http层 CSRF保护

    什么是CSRF攻击 CSRF是跨站请求伪造(Cross-site request forgery)的英文缩写。CS...

  • Django模板[CSRF]

    CSRF 防csrf的使用 取消csrf保护 保护原理 CSRF 全称Cross Site Request For...

  • [译]不在路由中使用 CSRF 中间件 Laravel 5.1

    原文地址: Excluding Routes from the CSRF Middleware Laravel 默...

  • laravel的CSRF防护机制和延伸

    在说laravel框架里对CSRF的攻击防护之前先对XSS和CSRF攻击做一下简单的介绍。 XSS和CSRF攻击 ...

  • Laravel 和 Tp5的一些区别

    1.0 Laravel 在表单提交的时候会有csrf 跨站请求伪造验证,Tp5则没有。 2.0 Laravel 在...

  • laravel中csrf验证详解

    laravel默认开启了csrf验证,当form表单提交数据时须带上csrf的token值,校验不通过就返回419...

网友评论

      本文标题:Laravel 阅读:CSRF 保护

      本文链接:https://www.haomeiwen.com/subject/jjnfzftx.html