12/08/2018, 17:12

Laravel: Tìm hiểu về CSRF Protection

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 đã được xác thực. Laravel tự động tạo ra một CSRF "token" cho mỗi phiên người ...

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 đã được xác thực.

Laravel tự động tạo ra một CSRF "token" cho mỗi phiên người dùng đang hoạt động do ứng dụng quản lý. Token này dùng để xác minh rằng người dùng đã được chứng thực là người thực hiện yêu cầu cho ứng dụng.

Bất cứ khi nào bạn tạo mộ HTML form trong ứng dụng của bạn, bạn nên thêm một hidden field 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 field nà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.

CSRF Tokens & JavaScript

Khi xây dựng các ứng dụng dựa trên mã JavaScript, nó thật thuận tiện để có thư viện JavaScript HTTP của bạn tự động gắn mã thông báo CSRF vào mọi yêu cầu gửi đi. Theo mặc định, resources/assets/js/bootstrap.js file đăng ký giá trị của csrf-token meta tag với thư viện Axios HTTP. Nếu bạn không sử dụng thư viện này, bạn cần phải tự cấu hình behavior này cho ứng dụng của bạn.

Đôi khi bạn muốn loại bỏ URIs khỏi CSRF protection. 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 đến 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 web middleware mà RouteServiceProvider á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 VerifyCsrfToken middleware :

<?php

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;

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

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

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

Sau đó, khi bạn đã tạo ra thẻ meta, bạn có thể hướng dẫn một thư viên như jQuery để tự động thêm token vào tất cả cá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')
    }
});

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ị X-XSRF-TOKEN request header.

Cookie này chủ yếu được gửi đến một cách thuận tiện từ khi một số frameworks và thự viện của JavaScript, như Angular và Axios, nó tự động thêm giá trị vào X-XSRF-TOKEN header.

Tài liệu: https://laravel.com/docs/5.4/csrf

0