Get in touch
or send us a question?
CONTACT

Các mẹo bảo mật trên framwork laravel (Phần 2)

Cross Site Scripting (XSS)

Các cuộc tấn công XSS là các cuộc tấn công tiêm trong đó các tập lệnh độc hại (chẳng hạn như đoạn mã JavaScript) được đưa vào các trang web đáng tin cậy.

Công cụ tạo mẫu Blade của Laravel có các câu lệnh echo {{ }}tự động thoát khỏi các biến bằng cách sử dụng htmlspecialcharshàm PHP để bảo vệ khỏi các cuộc tấn công XSS.

Laravel cũng cung cấp hiển thị dữ liệu không thoát bằng cú pháp không thoát {!! !!}. Điều này không được sử dụng trên bất kỳ dữ liệu không đáng tin cậy nào, nếu không ứng dụng của bạn sẽ bị tấn công XSS.

Ví dụ: nếu bạn có một cái gì đó như thế này trong bất kỳ mẫu Blade nào của mình, nó sẽ dẫn đến một lỗ hổng:

{!! request()->input('somedata') !!}

Tuy nhiên, điều này là an toàn để làm:

{{ request()->input(‘somedata’) }}

Để biết thông tin khác về cách ngăn chặn XSS không dành riêng cho Laravel, bạn có thể tham khảo Biểu mẫu ngăn chặn tập lệnh chéo trang web .

Tải lên tệp không hạn chế

Các cuộc tấn công tải lên tệp không hạn chế yêu cầu những kẻ tấn công tải lên các tệp độc hại để xâm phạm các ứng dụng web. Phần này mô tả cách bảo vệ chống lại các cuộc tấn công như vậy trong khi xây dựng các ứng dụng Laravel. Bạn cũng có thể tham khảo Bảng đánh giá Tải lên Tệp để tìm hiểu thêm.

Luôn xác thực loại và kích thước tệp

Luôn xác thực loại tệp (phần mở rộng hoặc kiểu MIME) và kích thước tệp để tránh các cuộc tấn công DOS lưu trữ và thực thi mã từ xa:

$request->validate([
    'photo' => 'file|size:100|mimes:jpg,bmp,png'
]);

Các cuộc tấn công DOS lưu trữ khai thác các xác thực kích thước tệp bị thiếu và tải lên các tệp lớn để gây ra từ chối dịch vụ (DOS) bằng cách sử dụng hết dung lượng đĩa.

Các cuộc tấn công thực thi mã từ xa đòi hỏi trước tiên, tải lên các tệp thực thi độc hại (chẳng hạn như tệp PHP) và sau đó, kích hoạt mã độc hại của chúng bằng cách truy cập URL tệp (nếu công khai).

Cả hai cuộc tấn công này đều có thể tránh được bằng cách xác thực tệp đơn giản như đã đề cập ở trên.

Không dựa vào đầu vào của người dùng để đọc tên tệp hoặc đường dẫn

Nếu ứng dụng của bạn cho phép dữ liệu do người dùng kiểm soát để xây dựng đường dẫn tải lên tệp, điều này có thể dẫn đến việc ghi đè tệp quan trọng hoặc lưu trữ tệp ở vị trí không hợp lệ.

Hãy xem xét đoạn mã sau:

Route::post('/upload', function (Request $request) {
    $request->file('file')->storeAs(auth()->id(), $request->input('filename'));

    return back();
});

Lộ trình này lưu một tệp vào một thư mục cụ thể cho một ID người dùng. Ở đây, chúng tôi dựa filenamevào dữ liệu đầu vào của người dùng và điều này có thể dẫn đến lỗ hổng vì tên tệp có thể giống như vậy ../2/filename.pdf. Thao tác này sẽ tải lên tệp trong thư mục của user ID 2 thay vì thư mục liên quan đến người dùng đã đăng nhập hiện tại.

Để khắc phục điều này, chúng ta nên sử dụng basename function PHP để loại bỏ bất kỳ thông tin thư mục nào khỏi filename dữ liệu đầu vào:

Route::post('/upload', function (Request $request) {
    $request->file('file')->storeAs(auth()->id(), basename($request->input('filename')));

    return back();
});

Tránh xử lý các tệp ZIP hoặc XML nếu có thể

Các tệp XML có thể khiến ứng dụng của bạn phải đối mặt với nhiều loại tấn công khác nhau, chẳng hạn như tấn công XXE, tấn công tỷ tiếng cười và những cuộc tấn công khác. Nếu bạn xử lý các tệp ZIP, bạn có thể bị tấn công DOS bằng bom zip.

Tham khảo Bảng kiểm tra bảo mật XML và Bảng kiểm tra tải lên tệp để tìm hiểu thêm.

Path Traversal

Một cuộc tấn công duyệt qua đường dẫn nhằm mục đích truy cập các tệp bằng cách thao tác dữ liệu đầu vào yêu cầu với ../các trình tự và biến thể hoặc bằng cách sử dụng các đường dẫn tệp tuyệt đối.

Nếu bạn cho phép người dùng tải xuống tệp theo tên tệp, bạn có thể bị lộ lỗ hổng này nếu dữ liệu đầu vào không bị loại bỏ thông tin thư mục.

Hãy xem xét đoạn mã sau:

Route::get(‘/download’, function(Request $request) { return response()->download(storage_path(‘content/’).$request->input(‘filename’)); });

Open Redirection

Open Redirection attacks in themselves are not that dangerous but they enable phishing attacks.

Consider the following code:

Route::get('/redirect', function (Request $request) {
   return redirect($request->input('url'));
});

This code redirects the user to any external URL provided by user input. This could enable attackers to create seemingly safe URLs like https://example.com/redirect?url=http://evil.com. For instance, attackers may use a URL of this type to spoof password reset emails and lead victims to expose their credentials on the attacker's website.