CSRF Protection

CSRF Protection

Giới thiệu

Laravel làm nó dễ dàng để bảo vệ ứng dụng của bạn từ các cuộc tấn công cross-site request forgery (CSRF). Cross-site request forgeries là một loại khai thác độc hại theo đó các lệnh không được phép được thực hiện thay cho một user đã đăng nhập.

Laravel tự động tạo một CSRF “token” cho mỗi phiên người dùng hoạt động đã quản lý bởi ứng dụng. Token này được sử dụng để xác thực rằng người dùng đã đăng nhập là một việc làm có thực các request gửi tới ứng dụng.

Bất cứ lúc nào bạn định nghĩa một HTML form trong ứng dụng của bạn, bạn nên bao gồm một trường CSRF token ẩn trong form để mà CSRF protection middleware có thể xác nhận request. Bạn có thể sử dụng chỉ thị @csrf Blade để tạo trường token:


<form method="POST" action="/profile">

    @csrf

    ...

</form>

The VerifyCsrfToken middleware, được bao gồm web middleware group, sẽ tự động xác nhận rằng token trong request nhập vào có khớp với token đã lưu trong session.

CSRF Tokens & JavaScript

Khi xây dựng JavaScript thúc đẩy các ứng dụng, nó thuận tiện để JavaScript HTTP library của bạn tự động đính kèm CSRF token tới mỗi request gửi đi. Theo mặc định, Axios HTTP library đã cung cấp trong file resources/js/bootstrap.js tự động gửi một X-XSRF-TOKEN header sử dụng giá trị đã được mã hóa XSRF-TOKEN cookie. Nếu bạn không sử dụng thư viện này, bạn sẽ cần phải cấu hình thủ công hành vi này cho ứng dụng của bạn.

Excluding URIs From CSRF Protection

Đôi khi bạn có thể muốn loại trừ một bộ URIs từ CSRF protection. Thí dụ, nếu bạn đang sử dụng Stripe để quá trình payments và are utilizing their webhook system, bạn sẽ cần phải loại trừ Stripe webhook handler route của bạn từ CSRF protection vì Stripe sẽ không biết cái CSRF token để gửi tới các route của bạn.

Điển hình, bạn nên đặt những kiểu của các route bên ngoài web middleware group để RouteServiceProvider áp dụng tới tất cả các route trong file routes/web.php . Tuy nhiên, bạn cũng có thể loại trừ các route bằng cách thêm URIs của chúng tới $except thuộc tính của VerifyCsrfToken middleware:


<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware

{

    /**

     * The URIs that should be excluded from CSRF verification.

     *

     * @var array

     */

    protected $except = [

        'stripe/*',

        'http://example.com/foo/bar',

        'http://example.com/foo/*',

    ];

}


The CSRF middleware được tự động ngắt khi running tests
.

X-CSRF-TOKEN

Ngoài việc kiểm tra CSRF token như một POST parameter, VerifyCsrfToken middleware cũng sẽ kiểm tra X-CSRF-TOKEN request header. Bạn có thể, ví dụ, lưu token trong một HTML meta tag:


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

Sau đó, một khi bạn đã tạo meta tag, bạn có thể dạy một thư viện như jQuery để nó tự động thêm token tới tất cả request headers. Những cung cấp đơn giản này, thuận tiện CSRF protection cho AJAX của bạn được dựa trên các ứng dụng:


$.ajaxSetup({

    headers: {

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

    }

});

X-XSRF-TOKEN

Laravel lưu CSRF token hiện tại trong một XSRF-TOKEN cookie đã được mã hóa bao gồm với mỗi phản hồi được tạo bởi framework. Bạn có thể sử dụng giá trị cookie tới bộ X-XSRF-TOKEN request header.

Cookie này sẽ được gửi chủ yếu như một kiểu tiện lợi, vì một vài JavaScript frameworks và các library, như Angular và Axios, tự động đặt giá trị của nó trong X-XSRF-TOKEN header on same-origin requests.


Mặc định, resources/js/bootstrap.js file bao gồm Axios HTTP library sẽ tự động gửi cái này cho bạn.