Không phân công hàng loạt có nghĩa là gì ở Laravel?


159

Khi tôi xem qua Tài liệu của Laravel về phần chủ đề ORM Eloquent, tôi đã nhận được một thuật ngữ mới Mass Assignment.

Tài liệu chương trình Làm thế nào để làm hàng loạt Chuyển nhượng và các fillablehoặc guardedcác thuộc tính thiết lập. Nhưng sau khi trải qua điều đó, tôi không hiểu rõ về Mass Assignmentcách thức hoạt động của nó.

Theo kinh nghiệm trước đây của tôi về CodeIgniter, tôi cũng không nghe về thuật ngữ này.

Có ai có một lời giải thích đơn giản về điều đó?


Câu trả lời:


206

Việc gán khối lượng là khi bạn gửi một mảng cho việc tạo mô hình, về cơ bản thiết lập một loạt các trường trên mô hình trong một lần, thay vì từng cái một, đại loại như:

$user = new User(request()->all());

(Điều này thay vì đặt rõ ràng từng giá trị trên mô hình.)

Bạn có thể sử dụng fillableđể bảo vệ những lĩnh vực bạn muốn điều này thực sự cho phép cập nhật.

Bạn cũng có thể chặn tất cả các trường không được gán khối lượng bằng cách thực hiện việc này:

protected $guarded = ['*'];

Giả sử trong bảng người dùng của bạn, bạn có một trường user_typevà có thể có các giá trị của người dùng / quản trị viên

Rõ ràng, bạn không muốn người dùng có thể cập nhật giá trị này. Về lý thuyết, nếu bạn đã sử dụng mã ở trên, ai đó có thể đưa vào một biểu mẫu một trường mới user_typevà gửi 'quản trị viên' cùng với dữ liệu biểu mẫu khác và dễ dàng chuyển tài khoản của họ sang tài khoản quản trị viên ... tin xấu.

Bằng cách thêm:

$fillable = ['name', 'password', 'email'];

Bạn đang đảm bảo rằng chỉ những giá trị đó mới có thể được cập nhật bằng mass assignment

Để có thể cập nhật user_typegiá trị, bạn cần đặt nó một cách rõ ràng trên mô hình và lưu nó, như thế này:

$user->user_type = 'admin';
$user->save();

16
Cảm ơn câu trả lời này, tôi hoàn toàn không hiểu ai sẽ làm những việc như $user = new User(Input::all());(với tư cách là lập trình viên), nó không được kiểm soát (hoặc trong kịch bản nào sẽ hữu ích như vậy).
Kyslik

14
... đó không phải là câu trả lời, đó là để giữ câu trả lời ngắn gọn mà không chiếm đoạt nó như một bài học về bảo mật, v.v.
duellsy

3
Tôi đã nhận được điểm, và tôi vui vì tôi đã tìm thấy câu trả lời này. Tôi chỉ tò mò về kịch bản nào được trích dẫn ở trên (trong bình luận của tôi) hữu ích. Tôi có nghĩa là không có xác nhận và tất cả những thứ xung quanh.
Kyslik

4
Vì vậy, bạn nghĩ rằng khi trả lời một câu hỏi có tiêu đề 'Việc chuyển nhượng hàng loạt có nghĩa là gì ở Laravel?' Tôi nên đi vào chi tiết về xác nhận ... đó là một câu trả lời đơn giản cho câu hỏi mà không bị lạc hướng. Hãy để nó như vậy.
duellsy

8
Không quan trọng vấn đề của câu hỏi OP tôi đã hỏi là gì vì vậy tôi không phải tạo chủ đề mới và bạn tiếp tục nói về "tại sao không" nói về nó. Tôi chỉ đơn giản là không hiểu tại sao ai đó sẽ sử dụng dòng như bạn đã viết nó thay vì$user = new User; $user->name = 'Neo';
Kyslik

25

Phân công hàng loạt là một quá trình gửi một mảng dữ liệu sẽ được lưu vào mô hình đã chỉ định cùng một lúc. Nói chung, bạn không cần phải lưu dữ liệu trên mô hình của mình từng cái một, mà là trong một quy trình duy nhất.

Phân công hàng loạt là tốt, nhưng có một số vấn đề bảo mật đằng sau nó. Điều gì xảy ra nếu ai đó chuyển một giá trị cho mô hình và không có bảo vệ, họ chắc chắn có thể sửa đổi tất cả các trường bao gồm ID. Điều đó không tốt.

Hãy nói rằng bạn có bảng 'của học sinh, với các lĩnh vực "student_type, first_name, last_name” . Bạn có thể muốn khối assign 'first_name, last_name' nhưng bạn muốn bảo vệ student_type khỏi bị thay đổi trực tiếp. Đó là nơi để điềncanh gác nơi mất.

Fillable cho phép bạn chỉ định trường nào có thể gán khối lượng trong mô hình của mình, bạn có thể thực hiện bằng cách thêm biến đặc biệt $fillablevào mô hình. Vì vậy, trong mô hình:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

' student_type ' không được bao gồm, có nghĩa là họ được miễn.

Bảo vệ là mặt trái của điền. Nếu fillable chỉ định trường nào sẽ được gán khối lượng, được bảo vệ chỉ định trường nào không được gán khối lượng. Vì vậy, trong mô hình:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

bạn nên sử dụng $ fillable hoặc $ được bảo vệ - không phải cả hai.

Để biết thêm chi tiết liên kết mở: - Bài tập lớn


1
Đây là cuốn sách ra khỏi cuốn sách "Laravel Up & Running" của Matt Stauffer
đánh vào

5

Phân công hàng loạt có nghĩa là bạn đang điền vào một hàng với nhiều hơn một cột bằng cách sử dụng một mảng dữ liệu. (phần nào của một phím tắt thay vì tự xây dựng mảng) bằng cách sử dụng Input::all().

Kỹ thuật chỉ từ đỉnh đầu của tôi. Fillable có nghĩa là những cột nào trong bảng được phép chèn, được bảo vệ có nghĩa là mô hình không thể chèn vào cột cụ thể đó.

Lưu ý rằng khi bạn cố gắng thực hiện gán khối lượng với like, chèn vào cột có tên "bí mật" và bạn đã chỉ định rằng nó được bảo vệ, bạn có thể thử chèn vào nó thông qua mô hình, nhưng nó sẽ không bao giờ thực sự được chèn vào kho dữ liệu.

Điều này là để bảo mật và bảo vệ trên bàn của bạn khi sử dụng mô hình. Việc chuyển nhượng hàng loạt dường như chỉ là một thông báo hoặc cảnh báo rằng bạn đã không nói với mô hình có thể lấp đầy và được bảo vệ và khiến nó dễ bị tấn công.


2

Đây là khi một mảng dữ liệu nhận được được lưu cùng một lúc trong một mô hình.

Do các vấn đề bảo mật với phương thức này trong laravel, chúng tôi khuyên bạn nên xác định các trường bạn muốn dữ liệu được yêu cầu cư trú trên Mô hình.

Bạn có thể sử dụng $fillablebiến để xác định các trường bạn muốn điền vào bảng cơ sở dữ liệu.

Ví dụ

Protected $fillable = [‘username’, dob’, email’,];

Khi laravel phát hiện ra bạn đang gán dữ liệu hàng loạt, nó buộc bạn phải xác định các trường bạn muốn gán khối trong lớp mô hình.

Ai đó có thể dễ dàng chuyển dữ liệu không mong muốn vào một biểu mẫu html vào cơ sở dữ liệu của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.