Bảo mật CSRF

Giới thiệu

Laravel rất dễ dàng để bảo vệ các ứng dụng của bạn từ tấn công giả mạo cross-site request forgery (CSRF). Cross-site request forgery là một loại mã độc, theo đó các lệnh trái phép được thực hiện thay cho một người dùng đã xác thực.

Laravel tự động tạo ra một CSRF "token" cho mỗi người dùng hoạt động quản lý bởi ứng dụng. Mã này dùng để xác minh rằng người dùng là một trong những người dùng thực sự gửi yêu cầu đến ứng dụng.

Bất cứ khi nào bạn tạo mộ HTML form trong ứng dụng, bạn phải thêm trường CSRF token vào trong form để bảo mật CSRF middleware có thể xác nhận request. Bạn có thể sử dụng csrf_field để sinh ra trường đấy:

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

Class VerifyCsrfToken middleware, bao gồm nhóm web middleware , sẽ tự động xác minh token từ request input giống với token lưu trong session.

Loại bỏ URIs khỏi bảo mật CSRF

Thỉnh thoảng bạn muốn loại bỏ URIs khỏi bảo mật CSRF. Ví dụ, nếu bạn sử dụng Stripe để xử lý thanh toán và được sử dụng hệ thống webhook của họ, bạn sẽ cần loại bỏ các xử lý route từ bảo mật CSRRF của Stripe webhook, khi đấy Stripe sẽ không biết CSRF token gửi từ route của bạn.

Thông thường, bạn nên loại bỏ các loại routes từ bên ngoài nhóm middleware webRouteServiceProvider áp dụng cho tất cả các route trong routes/web.php file. Tuy nhiên, bạn có thể loại bỏ route bằng cách thêm URIs vào thuộc tính $except trong middleware VerifyCsrfToken:

<?php

namespace App\Http\Middleware;

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

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

X-CSRF-TOKEN

Ngoài việc kiểm tra CSRF token như 1 tham số POST, middleware VerifyCsrfToken ngoài ra cũng kiểm tra các yêu cầu X-CSRF-TOKEN request header. Bạn có thể, ví dụ, lưu token trong thẻ meta:

<meta name="csrf-token" content="LYTemyqaEoRuV5AKD11GCTdgldYTZVyNnaASCcOZ">

Sau đó, khi bạn đã tạo ra thẻ meta, bạn có thể chỉ định một thư viên như jQuery để tự động thêm tất cả request header. Điều này rất đơn giản, thuận tiện để bảo mật CSRF các ứng dụng AJAX của bạn:

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

X-XSRF-TOKEN

Laravel lưu CSRF token hiện tại trong XSRF-TOKEN cookie mỗi khi có response tạo ra bởi framework. Bạn có thể sử dụng cookie để đặt giá trị các yêu cầuX-XSRF-TOKEN request header.

Cookie này chủ yếu gửi như một tiện nghi, kể từ khi có JavaScript frameworks, như Angular, nó tự động thêm giá trị vào X-XSRF-TOKEN header.

Nguồn: https://laravel.com/docs/5.3/csrf