Apa arti "Penugasan Massal" di Laravel?

159

Ketika saya membaca Dokumen Laravel tentang bagian topik ORM yang fasih, saya mendapat istilah baru Mass Assignment.

Dokumen menunjukkan Bagaimana melakukan Penugasan Massal dan fillableatau guardedpengaturan properti. Tetapi setelah melalui itu, saya tidak memiliki pemahaman yang jelas tentang Mass Assignmentdan bagaimana cara kerjanya.

Dalam pengalaman masa lalu saya di CodeIgniter, saya juga tidak mendengar tentang istilah ini.

Adakah yang punya penjelasan sederhana tentang itu?

Chen-Tsu Lin
sumber
3
Beberapa sumber daya Wikipedia atau Laravel 4 melindungi dari kerentanan ini dalam satu baris kode. Atau pos ini tentang kerentanan

Jawaban:

206

Tugas massal adalah ketika Anda mengirim array ke pembuatan model, pada dasarnya pengaturan sekelompok bidang pada model dalam sekali jalan, bukan satu per satu, seperti:

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

(Ini bukannya secara eksplisit menetapkan setiap nilai pada model secara terpisah.)

Anda dapat menggunakan fillableuntuk melindungi bidang mana yang Anda inginkan ini benar-benar memungkinkan untuk memperbarui.

Anda juga dapat memblokir semua bidang agar tidak dapat ditentukan secara massal dengan melakukan ini:

protected $guarded = ['*'];

Katakanlah dalam tabel pengguna Anda, Anda memiliki bidang yang user_typedan yang dapat memiliki nilai-nilai pengguna / admin

Jelas, Anda tidak ingin pengguna dapat memperbarui nilai ini. Secara teori, jika Anda menggunakan kode di atas, seseorang dapat menyuntikkan ke formulir bidang baru untuk user_typedan mengirim 'admin' bersama dengan data formulir lainnya, dan dengan mudah beralih akun mereka ke akun admin ... berita buruk.

Dengan menambahkan:

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

Anda memastikan bahwa hanya nilai-nilai itu yang dapat diperbarui menggunakan mass assignment

Agar dapat memperbarui user_typenilai, Anda perlu menetapkannya secara eksplisit pada model dan menyimpannya, seperti ini:

$user->user_type = 'admin';
$user->save();
duellsy
sumber
16
Terima kasih atas jawaban ini, saya sangat tidak mengerti siapa yang akan melakukan hal seperti $user = new User(Input::all());(sebagai programmer) itu sangat tidak terkendali (atau dalam skenario apa ini akan sangat membantu).
Kyslik
14
... itu sama sekali bukan inti dari jawaban, itu untuk menjaga jawaban singkat tanpa membajaknya sebagai pelajaran tentang keamanan dll
duellsy
3
Saya mengerti maksudnya, dan saya senang saya menemukan jawaban ini. Saya hanya ingin tahu skenario apa yang dikutip di atas (dalam komentar saya) yang bermanfaat. Maksud saya tanpa validasi dan semua hal di sekitar.
Kyslik
4
jadi Anda berpikir dalam menanggapi pertanyaan berjudul 'Apa arti "Penugasan Massal" di Laravel?' Saya seharusnya merinci tentang validasi ... itu adalah jawaban sederhana untuk pertanyaan tanpa keluar jalur. Mari kita biarkan apa adanya.
duellsy
8
Tidak masalah apa gunanya pertanyaan OP yang saya tanyakan jadi saya tidak perlu membuat utas baru, dan Anda terus berbicara tentang "mengapa tidak" membicarakannya. Saya benar-benar tidak mengerti mengapa seseorang menggunakan baris seperti yang Anda tulis, bukan$user = new User; $user->name = 'Neo';
Kyslik
26

Penugasan massal adalah proses pengiriman array data yang akan disimpan ke model yang ditentukan sekaligus. Secara umum, Anda tidak perlu menyimpan data pada model Anda satu per satu, tetapi dalam satu proses.

Tugas massal baik, tetapi ada masalah keamanan tertentu di belakangnya. Bagaimana jika seseorang memberikan nilai pada model dan tanpa perlindungan mereka pasti dapat memodifikasi semua bidang termasuk ID. Itu tidak baik.

Katakanlah Anda memiliki tabel 'student', dengan bidang "student_type, first_name, last_name" . Anda mungkin ingin menetapkan "first_name, last_name" secara massal tetapi Anda ingin melindungi student_type agar tidak langsung diubah. Di situlah tempat yang dapat diisi dan dijaga berlangsung.

Dapat diisi memungkinkan Anda menentukan bidang mana yang dapat ditentukan secara massal dalam model Anda, Anda dapat melakukannya dengan menambahkan variabel khusus $fillableke model. Jadi dalam model:

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

' student_type ' tidak termasuk, yang berarti mereka dikecualikan.

Dijaga adalah kebalikan dari bisa diisi. Jika bisa diisi menentukan bidang mana yang akan ditetapkan secara massal, dijaga menentukan bidang mana yang tidak dapat ditentukan secara massal. Jadi dalam model:

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

Anda harus menggunakan $ fillable atau $ guarded - tidak keduanya.

Untuk lebih jelasnya buka tautan: - Penugasan Massal

Udhav Sarvaiya
sumber
1
Ini langsung dari buku Matt Stauffer "Laravel Up & Running"
mengocok
5

Tugas massal berarti Anda mengisi baris dengan lebih dari satu kolom menggunakan larik data. (agak jalan pintas bukannya secara manual membangun array) menggunakan Input::all().

Secara teknis hanya dari atas kepalaku. Dapat diisi berarti kolom apa dalam tabel yang boleh dimasukkan, dijaga berarti model tidak dapat disisipkan ke kolom tertentu.

Perhatikan bahwa ketika Anda mencoba untuk melakukan tugas massal dengan suka, masukkan ke kolom bernama "rahasia", dan Anda telah menentukan bahwa itu dijaga, Anda dapat mencoba memasukkannya melalui model, tetapi itu tidak akan pernah benar-benar dimasukkan ke dalam data.

Ini untuk keamanan, dan perlindungan di meja Anda saat menggunakan model. Tugas massal tampaknya hanya pemberitahuan atau peringatan bahwa Anda tidak memberi tahu model mana yang bisa diisi dan dijaga dan membuatnya rentan terhadap beberapa jenis serangan.

majidarif
sumber
2

Ini adalah saat array data yang diterima disimpan sekaligus dalam suatu model.

Karena masalah keamanan dengan metode ini di laravel, Anda disarankan untuk menentukan bidang yang Anda inginkan untuk diisi data pada Model.

Anda bisa menggunakan $fillablevariabel untuk menentukan bidang yang ingin Anda isi pada tabel database.

Misalnya

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

Ketika laravel mendeteksi Anda menetapkan data secara massal, itu memaksa Anda untuk menentukan bidang yang ingin Anda tetapkan secara massal di kelas model.

Seseorang dapat dengan mudah mengirimkan data yang tidak diinginkan ke dalam bentuk html ke database Anda.

Punit khandelwal
sumber