Các bài viết

Laravel Web Security: Cross-Site Request Forgery (CSRF) là gì?

Trong hướng dẫn về Laravel này, chúng ta nói về Bảo mật Web và cách bảo vệ ứng dụng web khỏi các cuộc tấn công CSRF hoặc Cross-Site Request Forgery.

CSRF là một hoạt động độc hại được thực hiện bởi kẻ tấn công, kẻ này thực hiện các hành động thay mặt cho người dùng được xác thực, gây bất lợi cho bảo mật web. May mắn thay, Laravel cung cấp các công cụ để ngăn chặn loại lỗ hổng này.

CSRF là gì?

Các cuộc tấn công CSRF chiếm quyền điều khiển phiên người dùng. Họ làm điều này bằng cách lừa người dùng gửi yêu cầu thông qua thẻ biểu mẫu ẩn hoặc URL độc hại (hình ảnh hoặc liên kết) mà người dùng không hề hay biết.

Cuộc tấn công này dẫn đến thay đổi trạng thái phiên của người dùng, rò rỉ dữ liệu và đôi khi tin tặc có thể thao túng dữ liệu của người dùng cuối trong một ứng dụng.

Hình ảnh trên minh họa một tình huống trong đó bảo mật web bị vi phạm. Nạn nhân gửi yêu cầu bằng cách nhấp vào liên kết (đã nhận), gửi yêu cầu đến máy chủ trang web sẽ tạo ra các hiệu ứng mà tin tặc mong muốn, kẻ sở hữu thông tin hữu ích để truy cập và thao túng máy chủ trang web.

Cách ngăn chặn các yêu cầu CSRF

Để cải thiện an ninh web của ứng dụng của bạn, trong mỗi phiên người dùng, Laravel tạo mã thông báo bảo mật mà nó sử dụng để đảm bảo rằng người dùng được xác thực là người yêu cầu ứng dụng.

Vì mã thông báo này thay đổi mỗi khi phiên người dùng được tạo lại, nên kẻ tấn công không thể truy cập mã thông báo này.

Bất cứ khi nào có yêu cầu thay đổi thông tin người dùng phía máy chủ (phụ trợ) như POSTPUTPATCHDELETE, bạn phải bao gồm chỉ thị @csrf trong mẫu yêu cầu blade HTML. Các @csrf do đó nó là một chỉ thị Blade được sử dụng để tạo mã thông báo ẩn được ứng dụng xác thực.

chỉ thị Blade là cú pháp được sử dụng trong công cụ mẫu Laravel được gọi là Lưỡi . Để tạo một tập tin blade bạn phải đặt tên cho nó – trong trường hợp của chúng tôi – theo sau là phần mở rộng của lưỡi kiếm. Điều này có nghĩa là tệp sẽ có tên form.blade.php.

Các tập tin được sử dụng blade để hiển thị chế độ xem cho người dùng trên trang web. Có một vài chỉ dẫn trướcdefibạn có thể sử dụng cú pháp tốc ký nite hoặc blade. Ví dụ, @if kiểm tra nếu một điều kiện được thỏa mãn, @empty kiểm tra xem các bản ghi không trống, @auth kiểm tra xem người dùng có được xác thực hay không, v.v.

Nhưng chúng ta hãy quay trở lại chỉ thị @csrf. Đây là cách bạn sử dụng nó:

<form method="POST" action="{{route('pay')}}">

    @csrf
    
</form>

Các phiên bản trước của Laravel có cách thiết lập khác: cả hai đều hoạt động và thực hiện cùng một công việc.

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Khi mã thông báo CSRF bị thiếu trong yêu cầu biểu mẫu đang được gửi hoặc nếu nó có vẻ không hợp lệ, Laravel sẽ đưa ra thông báo lỗi “Page Expired” với mã trạng thái 419.

Cách thức và địa điểm xác minh CSRF diễn ra

phần mềm trung gian VerifyCsrfToken xử lý xác minh CSRF trong ứng dụng Laravel. Các middleware được đăng ký trong Kernel.php và nằm trong thư mục app/Http/Middleware. Điều này có nghĩa là middleware nó được kích hoạt cho các yêu cầu trong web, không liên quan đến API.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

Phần mềm trung gian VerifyCsrfToken mở rộng lớp Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, tức là xác minh CSRF là defitối trong lớp.

Hãy tìm hiểu sâu hơn để tìm hiểu cách Laravel xử lý xác minh CSRF.

Bên trong lớp, chúng ta có chức năng tokensMatch.

protected function tokensMatch($request)
{
     $token = $this->getTokenFromRequest($request);

     return is_string($request->session()->token()) &&
            is_string($token) &&
            hash_equals($request->session()->token(), $token);
}

trong mã xác định xem phiên và mã thông báo CSRF đầu vào có khớp hay không.

Hàm này thực hiện hai việc:

  1. lấy $this->getTokenFromRequest mã thông báo từ yêu cầu đến được đính kèm thông qua trường ẩn hoặc tiêu đề yêu cầu. Mã thông báo được giải mã và sau đó được trả về biến mã thông báo.
protected function getTokenFromRequest($request)
{
    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

    if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
        try {
            $token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
        } catch (DecryptException $e) {
            $token = '';
            }
    }

    return $token;
}

Trong mã, nó nhận được mã thông báo từ tiêu đề

2. Truyền cả mã thông báo yêu cầu và phiên thành một chuỗi rồi sử dụng hash_equals được xây dựng trong PHP để so sánh nếu cả hai chuỗi bằng nhau. Kết quả của hoạt động này luôn luôn bool (đúng) hoặc (sai) .

Ercole Palmeri

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.

Bài viết gần đây

Sự can thiệp sáng tạo vào thực tế tăng cường, với người xem Apple tại Phòng khám đa khoa Catania

Một ca phẫu thuật tạo hình mắt bằng cách sử dụng trình xem thương mại Apple Vision Pro đã được thực hiện tại Phòng khám đa khoa Catania…

3 May 2024

Lợi ích của việc tô màu cho trẻ em - thế giới kỳ diệu dành cho mọi lứa tuổi

Phát triển kỹ năng vận động tinh thông qua tô màu giúp trẻ chuẩn bị cho những kỹ năng phức tạp hơn như viết. Để tô màu…

2 May 2024

Tương lai là đây: Ngành vận tải biển đang cách mạng hóa nền kinh tế toàn cầu như thế nào

Ngành hải quân là một cường quốc kinh tế toàn cầu thực sự, đang hướng tới thị trường 150 tỷ...

1 May 2024

Các nhà xuất bản và OpenAI ký thỏa thuận điều chỉnh luồng thông tin được Trí tuệ nhân tạo xử lý

Thứ Hai tuần trước, Financial Times đã công bố một thỏa thuận với OpenAI. FT cấp phép cho hoạt động báo chí đẳng cấp thế giới…

30 tháng tư 2024

Đọc Đổi mới bằng ngôn ngữ của bạn

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.

Theo chúng tôi