0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Nguy cơ từ thuộc tính `$fillable` trong Laravel cho ứng dụng của bạn

Đăng vào 4 tháng trước

• 4 phút đọc

Chủ đề:

KungFuTech

Nguy cơ từ thuộc tính $fillable trong Laravel cho ứng dụng của bạn

Laravel là một framework PHP mạnh mẽ, với Eloquent ORM giúp tương tác với cơ sở dữ liệu một cách dễ dàng. Tuy nhiên, một cạm bẫy phổ biến liên quan đến thuộc tính $fillable có thể dẫn đến một lỗ hổng bảo mật nghiêm trọng được gọi là Lỗ hổng Gán hàng loạt (Mass Assignment Vulnerability), có thể làm suy yếu toàn bộ ứng dụng của bạn.

Mass Assignment là gì?

Gán hàng loạt là thực tiễn điền vào một model bằng một mảng dữ liệu đầu vào từ người dùng, thường từ một biểu mẫu gửi lên, trong một lần. Trong Laravel, điều này thường như sau:

php Copy
// Điền tất cả dữ liệu yêu cầu vào model
User::create($request->all()); // 👈 KHU VỰC NGUY HIỂM!

Điều này rất thuận tiện, nhưng lại nguy hiểm nếu bạn không kiểm soát các thuộc tính nào được phép thiết lập theo cách này.

Vai trò của thuộc tính $fillable

Thuộc tính $fillable trong một model Laravel là danh sách trắng của bạn cho việc gán hàng loạt. Nó xác định một mảng các cột mà bạn có thể an toàn điền vào bằng các phương thức như create(), update(), hoặc fill().

Nếu một thuộc tính không có trong mảng $fillable, lớp bảo mật của Laravel sẽ ngăn không cho nó được thiết lập thông qua gán hàng loạt.

Nguy cơ cho doanh nghiệp: Truy cập không hạn chế

Mã dưới đây minh họa nguy cơ:

  1. Model dễ bị tấn công: Model User có một cột nhạy cảm, is_admin, được đưa vào mảng $fillable.

    php Copy
    // Trong User.php
    protected $fillable = [
        'name',
        'email',
        'password',
        'is_admin', // 👈 LỖI
    ];
  2. Controller dễ bị tấn công: Ứng dụng chấp nhận và gán tất cả dữ liệu yêu cầu đã xác thực cho model một cách mù quáng.

    php Copy
    // Trong TestController.php
    User::create($request->all()); 

Một người dùng ác ý có thể đơn giản tiêm một trường is_admin vào dữ liệu biểu mẫu đăng ký của họ. Bởi vì controller sử dụng create($request->all())is_admin có trong $fillable, ứng dụng sẽ vui vẻ thiết lập thuộc tính is_admin của người dùng thành true (hoặc 1).

🔥 Kết quả: Một người dùng bình thường có thể ngay lập tức trở thành Quản trị viên, có quyền truy cập không hợp pháp vào dữ liệu nhạy cảm, bảng điều khiển và có thể làm hỏng toàn bộ hệ thống và tính toàn vẹn kinh doanh của bạn.


Giải pháp: Luôn hạn chế thuộc tính $fillable

Để bảo vệ doanh nghiệp của bạn, hãy luôn tuân theo quy tắc đơn giản này:

KHÔNG bao gồm các cột nhạy cảm, có quyền truy cập cao như is_admin, role, api_token, hoặc balance trong thuộc tính $fillable của model.

Sửa mã an toàn:

  1. Xóa trường nhạy cảm khỏi $fillable:

    php Copy
    // Mã an toàn trong User.php
    protected $fillable = [
        'name',
        'email',
        'password',
        // 'is_admin' đã BIẾN MẤT! ✅
    ];
  2. Xử lý rõ ràng các trường nhạy cảm (nếu cần): Nếu bạn cần thiết lập is_admin hoặc trường bảo vệ khác, hãy làm điều đó một cách rõ ràng, từng dòng một, chỉ sau khi kiểm tra quyền hạn.

    php Copy
    // Mã Controller an toàn
    $validatedData = $request->validate([...]);
    
    $user = User::create($validatedData); 
    
    // Chỉ thiết lập các trường bảo vệ nếu một quản trị viên có quyền đang thực hiện nó.
    // ví dụ: if (auth()->user()->isAdmin()) { $user->is_admin = 1; $user->save(); }

Bảo vệ ứng dụng của bạn bằng cách cẩn thận với các mảng $fillable của bạn!

Thực tiễn tốt nhất

  • Luôn kiểm tra quyền hạn trước khi thay đổi bất kỳ trường nhạy cảm nào.
  • Sử dụng các phương thức xác thực để đảm bảo rằng người dùng có quyền truy cập.
  • Giáo dục đội ngũ phát triển của bạn về những rủi ro liên quan đến gán hàng loạt.

Cạm bẫy phổ biến

  • Quên không kiểm tra quyền hạn trước khi gán giá trị cho các trường nhạy cảm.
  • Bao gồm các trường nhạy cảm trong $fillable, dẫn đến lỗ hổng bảo mật.

Mẹo hiệu suất

  • Sử dụng Eloquent Relationships để giảm thiểu việc lặp lại mã và tối ưu hóa hiệu suất.
  • Chỉ lấy những cột cần thiết thay vì tất cả các cột khi truy vấn dữ liệu.

Khắc phục sự cố

  • Nếu bạn đã gặp lỗi xác thực, hãy kiểm tra xem liệu dữ liệu đầu vào có đang cố gắng gán cho các trường không có trong $fillable hay không.

Câu hỏi thường gặp (FAQ)

1. $fillable là gì?
$fillable là thuộc tính trong model Laravel cho phép xác định các thuộc tính nào có thể được điền thông qua gán hàng loạt.

2. Tại sao không nên đưa các trường nhạy cảm vào $fillable?
Nếu các trường nhạy cảm như is_admin được đưa vào $fillable, người dùng có thể khai thác để thay đổi quyền hạn của họ.

3. Làm thế nào để bảo vệ ứng dụng Laravel của tôi?
Luôn kiểm tra và hạn chế các thuộc tính trong $fillable, đồng thời thực hiện kiểm tra quyền hạn chặt chẽ trước khi thực hiện các thay đổi nhạy cảm.

Tôi là Claude Fassinou, nhà phát triển phần mềm và người đánh giá mã.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào