Get in touch
or send us a question?
CONTACT

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

Laravel Framework cung cấp các tính năng bảo mật được tích hợp sẵn và có nghĩa là được bảo mật theo mặc định. Tuy nhiên, nó cũng cung cấp thêm tính linh hoạt cho các trường hợp sử dụng phức tạp. Điều này có nghĩa là các nhà phát triển không quen với hoạt động bên trong của Laravel có thể rơi vào bẫy của việc sử dụng các tính năng phức tạp theo cách không an toàn. Hướng dẫn này nhằm hướng dẫn các nhà phát triển tránh những cạm bẫy phổ biến và phát triển các ứng dụng Laravel một cách an toàn.

Bạn cũng có thể tham khảo Enlightn Security Documentation tài liệu này nêu bật các lỗ hổng phổ biến và các phương pháp hay về bảo mật các ứng dụng Laravel.

Những thứ cơ bản

  • Đảm bảo rằng ứng dụng của bạn không ở chế độ gỡ lỗi trong khi sản xuất. Để tắt chế độ gỡ lỗi, hãy đặt APP_DEBUGbiến môi trường của bạn thành false:
APP_DEBUG=false
  • Đảm bảo rằng khóa ứng dụng của bạn đã được tạo. Các ứng dụng Laravel sử dụng khóa ứng dụng để mã hóa đối xứng và hàm băm SHA256 như mã hóa cookie, URL đã ký, mã thông báo đặt lại mật khẩu và mã hóa dữ liệu phiên. Để tạo khóa ứng dụng, bạn có thể chạy key:generatelệnh Artisan:
php artisan key:generate
  • Đảm bảo rằng cấu hình PHP của bạn được bảo mật. Bạn có thể tham khảo Trang PHP Configuration Cheat để biết thêm thông tin về cài đặt cấu hình PHP an toàn.
  • Đặt quyền đối với tệp và thư mục an toàn trên ứng dụng Laravel của bạn. Nói chung, tất cả các thư mục Laravel phải được thiết lập với mức quyền tối đa 775và các tệp không thực thi có mức quyền tối đa là 664. Các tệp thực thi như Artisan hoặc tập lệnh triển khai phải được cung cấp mức quyền tối đa là 775.

Bảo mật cookie và session

  • Theo mặc định, Laravel được cấu hình theo cách an toàn. Tuy nhiên, nếu bạn thay đổi cấu hình cookie hoặc phiên của mình, hãy đảm bảo những điều sau:
  • Bật phần mềm trung gian mã hóa cookie nếu bạn sử dụng cookie cửa hàng phiên hoặc nếu bạn lưu trữ bất kỳ loại dữ liệu nào mà ứng dụng khách không thể đọc được hoặc giả mạo. Nói chung, điều này nên được bật trừ khi ứng dụng của bạn có một trường hợp sử dụng rất cụ thể yêu cầu tắt tính năng này. Để kích hoạt phần mềm trung gian này, chỉ cần thêm EncryptCookies phần mềm trung gian vào web nhóm phần mềm trung gian trong App\Http\Kernel lớp của bạn :
/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        ...
    ],
    ...
];
  • Bật HttpOnlythuộc tính trên cookie phiên của bạn thông qua config/session.phptệp của bạn , để cookie phiên của bạn không thể truy cập được từ Javascript:
'http_only' => true,
  • Trừ khi bạn đang sử dụng đăng ký tuyến miền phụ trong ứng dụng Laravel của mình, bạn nên đặt domainthuộc tính cookie thành null để chỉ có cùng nguồn gốc (không bao gồm miền phụ) mới có thể đặt cookie. Điều này có thể được định cấu hình trong config/session.php tệp của bạn :
'domain' => null,
  • Đặt SameSite thuộc tính cookie của bạn thành laxhoặc stricttrong config/session.php tệp của bạn để hạn chế cookie của bạn trong ngữ cảnh của bên thứ nhất hoặc cùng một trang web:
'same_site' => 'lax',
  • Nếu ứng dụng của bạn chỉ là HTTPS, bạn nên đặt securetùy chọn cấu hình trong config/session.php tệp của mình thành true để bảo vệ khỏi các cuộc tấn công trung gian. Nếu ứng dụng của bạn có sự kết hợp giữa HTTP và HTTPS, thì bạn nên đặt giá trị này thành null để thuộc tính an toàn được đặt tự động khi cung cấp các yêu cầu HTTPS:
secure' => null,
  • Đảm bảo rằng bạn có giá trị thời gian chờ phiên không hoạt động thấp. OWASP khuyến nghị thời gian chờ từ 2-5 phút nhàn rỗi đối với các ứng dụng có giá trị cao và 15-30 phút đối với các ứng dụng có rủi ro thấp. Điều này có thể được định cấu hình trong config/session.php tệp của bạn :
'lifetime' => 15,

Bạn cũng có thể tham khảo Hướng dẫn bảo mật cookie để tìm hiểu thêm về bảo mật cookie và các thuộc tính cookie được đề cập ở trên.

Xác thực

Guards and Providers

Về cốt lõi, các cơ sở xác thực của Laravel được tạo thành từ các “guards” và “prociders”. Guards vệ xác định cách người dùng được xác thực cho mỗi yêu cầu. Providers xác định cách người dùng được truy xuất từ ​​bộ nhớ liên tục của bạn.

Laravel cung cấp một bộ sessionbảo vệ duy trì trạng thái bằng cách sử dụng lưu trữ phiên và cookie cũng như bộ tokenphận bảo vệ cho các mã thông báo API.

Đối với Providers, Laravel giao hàng với eloquentnhà cung cấp để truy xuất người dùng bằng Eloquent ORM và database Providers để truy xuất người dùng bằng trình tạo truy vấn cơ sở dữ liệu.

Các bộ phận Guards và nhà cung cấp có thể được định cấu hình trong config/auth.php tệp. Laravel cũng cung cấp khả năng xây dựng các guards and providers tùy chỉnh.

Bộ công cụ xác thực

Laravel cung cấp nhiều bộ công cụ khởi động ứng dụng của bên thứ nhất bao gồm các tính năng xác thực được tích hợp sẵn:

  1. Laravel Breeze : Một triển khai đơn giản, tối thiểu tất cả các tính năng xác thực của Laravel bao gồm đăng nhập, đăng ký, đặt lại mật khẩu, xác minh email và xác nhận mật khẩu.
  2. Laravel Fortify : Một chương trình phụ trợ xác thực không đầu bao gồm các tính năng xác thực ở trên cùng với xác thực hai yếu tố.
  3. Laravel Jetstream : Một bộ khởi động ứng dụng cung cấp giao diện người dùng trên các tính năng xác thực của Laravel Fortify.

Bạn nên sử dụng một trong những bộ công cụ khởi động này để đảm bảo xác thực mạnh mẽ và an toàn cho các ứng dụng Laravel của bạn.

Xác thực API

Laravel cũng cung cấp các gói xác thực API sau:

  1. Passport : Xác thực authentication  OAuth2.
  2. Sanctum : Xác thực token authentication API.

Các bộ công cụ dành cho người mới bắt đầu như Fortify và Jetstream có hỗ trợ sẵn cho Sanctum.

Mass Assignment

Mass Assignment là một lỗ hổng phổ biến trong các ứng dụng web hiện đại sử dụng ORM như Eloquent ORM của Laravel.

Phép gán hàng loạt là một lỗ hổng trong đó mẫu ORM bị lạm dụng để sửa đổi các mục dữ liệu mà người dùng thường không được phép sửa đổi.

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

Route::any('/profile', function (Request $request) {
    $request->user()->forceFill($request->all())->save();

    $user = $request->user()->fresh();

    return response()->json(compact('user'));
})->middleware('auth');

Lộ trình hồ sơ trên cho phép người dùng đã đăng nhập thay đổi thông tin hồ sơ của họ.

Tuy nhiên, giả sử có một is_admincột trong bảng người dùng. Bạn có thể không muốn người dùng được phép thay đổi giá trị của cột này. Tuy nhiên, đoạn mã trên cho phép người dùng thay đổi bất kỳ giá trị cột nào cho hàng của họ trong bảng người dùng. Đây là một lỗ hổng phân công hàng loạt.

Theo mặc định, Laravel có các tính năng tích hợp để bảo vệ khỏi lỗ hổng này. Đảm bảo những điều sau để giữ an toàn:

  • Đủ điều kiện các tham số được phép mà bạn muốn cập nhật bằng cách sử dụng $request->onlyhoặc $request->validatedhơn là $request->all.
  • Không hủy chuẩn các mô hình hoặc đặt $guardedbiến thành một mảng trống. Bằng cách này, bạn thực sự đang vô hiệu hóa tính năng bảo vệ gán khối lượng có sẵn của Laravel.
  • Tránh sử dụng các phương pháp như forceFillhoặc forceCreatebỏ qua cơ chế bảo vệ. Tuy nhiên, bạn có thể sử dụng các phương pháp này nếu bạn đang chuyển vào một mảng giá trị đã được xác thực.

Nguồn: https://cheatsheetseries.owasp.org/cheatsheets/Laravel_CheatSheet.html