Co oznacza „Przydział masowy” w Laravel?

159

Kiedy przeczytałem Laravel Document o części tematycznej Eloquent ORM, dostałem nowy termin Mass Assignment.

Dokument pokazuje, jak wykonać przypisanie masowe i ustawienia właściwości fillablelub guarded. Ale po przejściu przez to nie miałem jasnego zrozumienia Mass Assignmenti jak to działa.

W moim poprzednim doświadczeniu w CodeIgniter również nie słyszałem o tym terminie.

Czy ktoś ma na ten temat proste wyjaśnienie?

Chen-Tsu Lin
źródło
3
Niektóre zasoby Wikipedia lub Laravel 4 chronią przed tą luką w jednej linii kodu. Albo ten post dotyczący luki w zabezpieczeniach

Odpowiedzi:

206

Masowe przypisanie ma miejsce, gdy wysyłasz tablicę do tworzenia modelu, w zasadzie ustawiając kilka pól w modelu za jednym razem, a nie pojedynczo, na przykład:

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

(Zamiast jawnie ustawiać każdą wartość w modelu osobno).

Możesz użyć, fillableaby zabezpieczyć, które pola mają faktycznie umożliwić aktualizację.

Możesz również zablokować możliwość masowego przypisywania wszystkich pól, wykonując następujące czynności:

protected $guarded = ['*'];

Powiedzmy, że w swojej tabeli użytkowników masz pole, które to jest user_typei może mieć wartości user / admin

Oczywiście nie chcesz, aby użytkownicy mogli aktualizować tę wartość. Teoretycznie, gdybyś użył powyższego kodu, ktoś mógłby wstrzyknąć do formularza nowe pole user_typei wysłać 'admin' wraz z innymi danymi formularza, a także łatwo przełączyć swoje konto na konto administratora ... zła wiadomość.

Poprzez dodanie:

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

Zapewniasz, że tylko te wartości mogą być aktualizowane za pomocą mass assignment

Aby móc zaktualizować user_typewartość, musisz jawnie ustawić ją w modelu i zapisać, na przykład:

$user->user_type = 'admin';
$user->save();
duellsy
źródło
16
Dzięki za tę odpowiedź, całkiem nie rozumiem, kto zrobiłby coś takiego, jak $user = new User(Input::all());(jako programista) jest tak niekontrolowany (lub w jakim scenariuszu byłby taki pomocny).
Kyslik
14
... to wcale nie jest punkt odpowiedzi, chodzi o to, aby odpowiedź była krótka bez przechwytywania jej jako całej lekcji na temat bezpieczeństwa itp.
duellsy
3
Zrozumiałem i cieszę się, że znalazłem tę odpowiedź. Ciekawi mnie tylko, w jakim scenariuszu cytowana powyżej (w moim komentarzu) linia jest przydatna. Mam na myśli bez weryfikacji i tego wszystkiego dookoła.
Kyslik
4
więc myślisz w odpowiedzi na pytanie zatytułowane „Co oznacza„ Przydział masowy ”w Laravel? Powinienem był szczegółowo omówić walidację ... to była prosta odpowiedź na pytanie bez zbaczania z kursu. Zostawmy to tak, jak jest.
duellsy
8
Nie ma znaczenia, jaki jest sens pytania OP, które zadałem, więc nie muszę tworzyć nowego wątku, a ty ciągle mówisz o tym „dlaczego nie”. Po prostu nie rozumiem, po co ktoś miałby używać linii, tak jak ją napisałeś, zamiast$user = new User; $user->name = 'Neo';
Kyslik
26

Masowe przypisanie to proces wysyłania tablicy danych, które zostaną od razu zapisane w określonym modelu. Ogólnie rzecz biorąc, nie musisz zapisywać danych w modelu pojedynczo, ale raczej w ramach jednego procesu.

Przydział masowy jest dobry, ale stoją za nim pewne problemy z bezpieczeństwem. Co jeśli ktoś przekaże wartość do modelu i bez ochrony może zdecydowanie zmodyfikować wszystkie pola łącznie z ID. To nie jest dobrze.

Załóżmy, że masz tabelę „uczniów” z polami „student_type, first_name, last_name” . Możesz chcieć masowo przypisać „first_name, last_name”, ale chcesz zabezpieczyć student_type przed bezpośrednią zmianą. To jest miejsce, w którym można wypełnić i pilnować .

Możliwość wypełnienia pozwala określić, które pola są przypisywane masowo w modelu, możesz to zrobić, dodając specjalną zmienną $fillabledo modelu. A więc w modelu:

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

student_type ” nie są uwzględnione, co oznacza, że ​​są wyłączone.

Chroniony jest odwrotnością wypełnienia. Jeśli wypełnienie określa, które pola mają być przypisane masowo, chronione określa, które pola nie są przypisywane masowo. A więc w modelu:

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

powinieneś użyć $ fillable lub $ guarded - nie obu.

Aby uzyskać więcej informacji, otwórz link: - Przydział masowy

Udhav Sarvaiya
źródło
1
Jest to prosto z książki Matta Stauffer za „laravel Up & Running”
miotełka
5

Przypisanie masowe oznacza, że ​​wypełniasz wiersz więcej niż jedną kolumną przy użyciu tablicy danych. (coś w rodzaju skrótu zamiast ręcznego budowania tablicy) przy użyciu Input::all().

Technicznie tylko z czubka głowy. Możliwość wypełnienia oznacza, które kolumny w tabeli mogą być wstawiane, chronione oznacza, że ​​model nie może wstawić do tej konkretnej kolumny.

Zauważ, że kiedy próbujesz wykonać przypisanie masy za pomocą like, wstaw do kolumny o nazwie "sekret" i określiłeś, że jest ona chroniona, możesz spróbować wstawić do niej przez model, ale tak naprawdę nigdy nie zostanie wstawiona do baza danych.

Ma to na celu zapewnienie bezpieczeństwa i ochrony Twojego stołu podczas korzystania z modelu. Masowe przypisanie wydaje się być tylko ostrzeżeniem lub ostrzeżeniem, że nie powiedziałeś modelowi, które są do wypełnienia i strzeżone, co czyni go podatnym na pewnego rodzaju ataki.

majidarif
źródło
2

Dzieje się tak, gdy tablica otrzymanych danych jest zapisywana jednocześnie w modelu.

Ze względu na problemy z bezpieczeństwem związane z tą metodą w laravel, zaleca się zdefiniowanie pól, które mają być wypełnione żądanymi danymi w modelu.

Możesz użyć $fillablezmiennej do zdefiniowania pól, które chcesz wypełnić w tabeli bazy danych.

Na przykład

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

Kiedy laravel wykryje, że masowo przypisujesz dane, zmusza cię do zdefiniowania pól, które chcesz przypisać masowo w klasie modelu.

Ktoś może łatwo przekazać niechciane dane do formularza HTML do Twojej bazy danych.

Punit khandelwal
źródło