Tóm Tắt
Thiết kế web bạn có từng quan tâm đến bảo mật website của mình hay chưa? Bạn đang lập trình dự án bằng Laravel vậy bạn cóp tự hỏi bảo mật laravel bằng cách nào không? Bài viết này tôi tổng hợp kiến thức từ các bài viết cùng chủ để nói về bảo mật website laravel bằng CSRF Protection.
Giới thiệ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 (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
, 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.
Loại trừ URIs khỏi CSRF Protection
Đôi khi bạn muốn loại bỏ URIs khỏi CSRF protection. Ví dụ, nếu bạn sử dụng để 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 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, 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')
}
});
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ị 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.