“ การมอบหมายจำนวนมาก” หมายถึงอะไรใน Laravel


159

เมื่อฉันเดินผ่าน Laravel Mass Assignmentเอกสารเกี่ยวกับฝีปากออมส่วนหนึ่งหัวข้อที่ผมได้คำใหม่

แสดงเอกสารวิธีการมอบหมายจำนวนมากและการตั้งค่าคุณสมบัติfillableหรือ guardedแต่หลังจากผ่านไปแล้วฉันก็ไม่เข้าใจอย่างถ่องแท้Mass Assignmentและมันทำงานอย่างไร

จากประสบการณ์ที่ผ่านมาของฉันใน CodeIgniter ฉันไม่เคยได้ยินคำนี้

ใครบ้างมีคำอธิบายง่ายๆเกี่ยวกับที่?


3
ทรัพยากรบางอย่างWikipediaหรือLaravel 4 ป้องกันความเสี่ยงนี้ในโค้ดบรรทัดเดียว หรือโพสต์นี้เกี่ยวกับช่องโหว่

คำตอบ:


206

การมอบหมายจำนวนมากคือเมื่อคุณส่งอาร์เรย์ไปยังการสร้างแบบจำลองโดยทั่วไปแล้วการตั้งค่าฟิลด์จำนวนมากบนแบบจำลองในครั้งเดียวแทนที่จะเป็นแบบหนึ่งต่อหนึ่งสิ่งที่ชอบ:

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

(นี่เป็นการแทนการตั้งค่าแต่ละค่าบนโมเดลแยกกันอย่างชัดเจน)

คุณสามารถใช้fillableเพื่อป้องกันฟิลด์ที่คุณต้องการให้อนุญาตให้อัปเดตได้จริง

คุณยังสามารถบล็อกฟิลด์ทั้งหมดไม่ให้กำหนดได้โดยทำดังนี้

protected $guarded = ['*'];

สมมติว่าในตารางผู้ใช้ของคุณคุณมีเขตข้อมูลuser_typeที่สามารถมีค่าของผู้ใช้ / ผู้ดูแลระบบ

เห็นได้ชัดว่าคุณไม่ต้องการให้ผู้ใช้สามารถอัปเดตค่านี้ ตามทฤษฎีแล้วถ้าคุณใช้รหัสข้างต้นใครบางคนสามารถแทรกลงในแบบฟอร์มเป็นเขตข้อมูลใหม่user_typeและส่ง 'ผู้ดูแลระบบ' พร้อมกับข้อมูลในแบบฟอร์มอื่น ๆ และเปลี่ยนบัญชีของพวกเขาเป็นบัญชีผู้ดูแลระบบได้อย่างง่ายดาย ... ข่าวร้าย

โดยการเพิ่ม:

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

คุณมั่นใจว่าสามารถอัพเดตค่าเหล่านั้นได้โดยใช้เท่านั้น mass assignment

เพื่อให้สามารถอัปเดตuser_typeค่าได้คุณต้องกำหนดอย่างชัดเจนในแบบจำลองและบันทึกไว้เช่นนี้

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

16
ขอบคุณสำหรับคำตอบนี้ฉันค่อนข้างไม่เข้าใจว่าใครจะทำสิ่งต่าง ๆ เช่น$user = new User(Input::all());(ในฐานะโปรแกรมเมอร์) มันไม่สามารถควบคุมได้ (หรือในสถานการณ์ที่จะมีประโยชน์)
Kyslik

14
... มันไม่ได้อยู่ที่คำตอบเลยก็คือให้ตอบสั้น ๆ โดยไม่ต้องจี้มันเป็นบทเรียนทั้งหมดเกี่ยวกับการรักษาความปลอดภัยและอื่น ๆ
duellsy

3
ฉันเข้าใจแล้วและฉันดีใจที่พบคำตอบนี้ ฉันแค่อยากรู้ในสิ่งที่สถานการณ์อ้างถึงข้างต้น (ในความคิดเห็นของฉัน) มีประโยชน์ ฉันหมายถึงไม่มีการตรวจสอบและทุกสิ่งที่อยู่รอบ ๆ
Kyslik

4
ดังนั้นคุณคิดว่าจะตอบคำถามที่มีชื่อว่า "การมอบหมายจำนวนมาก" ใน Laravel หมายความว่าอะไร? ฉันควรจะลงรายละเอียดเกี่ยวกับการตรวจสอบความถูกต้อง ... มันเป็นคำตอบที่ง่ายสำหรับคำถามโดยไม่ต้องออกนอกลู่นอกทาง ปล่อยให้เรื่องนี้เป็นอย่างที่มันเป็น
duellsy

8
มันไม่สำคัญว่าประเด็นคำถาม OP ที่ฉันถามคืออะไรฉันจึงไม่ต้องสร้างหัวข้อใหม่และคุณพูดถึงเรื่อง "ทำไมไม่" พูดถึงมัน ฉันไม่เข้าใจว่าทำไมบางคนถึงใช้ไลน์ตามที่คุณเขียนแทน$user = new User; $user->name = 'Neo';
Kyslik

26

การกำหนดจำนวนมากเป็นกระบวนการในการส่งข้อมูลจำนวนมากซึ่งจะถูกบันทึกลงในโมเดลที่ระบุในคราวเดียว โดยทั่วไปคุณไม่จำเป็นต้องบันทึกข้อมูลในแบบจำลองของคุณแบบทีละแบบ แต่จะทำในขั้นตอนเดียว

การมอบหมายจำนวนมากนั้นดี แต่ก็มีปัญหาด้านความปลอดภัยอยู่บ้าง จะเกิดอะไรขึ้นถ้ามีคนส่งค่าไปยังโมเดลและไม่มีการป้องกันพวกเขาสามารถแก้ไขฟิลด์ทั้งหมดรวมถึง ID ได้อย่างแน่นอน นั่นไม่ดีเลย

สมมติว่าคุณมีตาราง 'นักเรียน' พร้อมเขตข้อมูล "student_type, first_name, last_name” . คุณอาจต้องการที่จะมวลกำหนด 'first_name, last_name' แต่คุณต้องการที่จะปกป้อง student_typeจากการเปลี่ยนแปลงโดยตรง. ที่ที่ fillableและเตรียมพร้อมใช้สถานที่

Fillable ช่วยให้คุณระบุฟิลด์ที่สามารถกำหนดได้โดยรวมในโมเดลของคุณคุณสามารถทำได้โดยเพิ่มตัวแปรพิเศษ$fillableให้กับโมเดล ดังนั้นในรูปแบบ:

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

ไม่รวม' student_type ' ซึ่งหมายความว่าได้รับการยกเว้น

เตรียมพร้อมคือสิ่งที่ตรงกันข้ามของ fillable ถ้า fillable ระบุว่าจะต้องกำหนดฟิลด์ใดให้เป็นจำนวนมาก guarded จะระบุว่าฟิลด์ใดที่ไม่สามารถกำหนดค่าได้จำนวนมาก ดังนั้นในรูปแบบ:

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

คุณควรใช้ $ fillable หรือ $ guarded ไม่ใช่ทั้งสองอย่าง

สำหรับรายละเอียดเพิ่มเติมเปิดลิงก์: - การมอบหมายจำนวนมาก


1
ตรงนี้ออกมาจากหนังสือของ Matt Stauffer "Laravel Up & Running"
ตี

5

การมอบหมายจำนวนมากหมายถึงคุณกำลังเติมแถวที่มีมากกว่าหนึ่งคอลัมน์โดยใช้อาร์เรย์ของข้อมูล (บางส่วนของทางลัดแทนการสร้างอาร์เรย์) Input::all()โดยใช้

ในทางเทคนิคเพียงแค่จากด้านบนของหัวของฉัน Fillable หมายถึงสิ่งที่คอลัมน์ในตารางได้รับอนุญาตให้แทรกการรักษาหมายถึงแบบจำลองไม่สามารถแทรกไปยังคอลัมน์นั้น

โปรดสังเกตว่าเมื่อคุณพยายามทำการมอบหมายจำนวนมากด้วย Like ให้แทรกคอลัมน์ที่ชื่อว่า "secret" และคุณได้ระบุว่าได้รับการปกป้องคุณสามารถลองแทรกผ่านทางโมเดลได้ แต่จะไม่ถูกแทรกเข้าไป ฐานข้อมูล

นี่เพื่อความปลอดภัยและการป้องกันบนโต๊ะของคุณเมื่อใช้รุ่น การมอบหมายจำนวนมากดูเหมือนจะเป็นเพียงการบอกกล่าวหรือเตือนว่าคุณไม่ได้บอกรูปแบบที่สามารถบรรจุและป้องกันได้และทำให้มันเสี่ยงต่อการถูกโจมตีบางประเภท


2

นี่คือเมื่ออาร์เรย์ของข้อมูลที่ได้รับถูกบันทึกพร้อมกันในรูปแบบ

เนื่องจากปัญหาด้านความปลอดภัยเกี่ยวกับวิธีการนี้เป็น laravel เราขอแนะนำให้คุณกำหนดเขตข้อมูลที่คุณต้องการให้มีการเติมข้อมูลลงในแบบจำลอง

คุณสามารถใช้ $fillableตัวแปรเพื่อกำหนดเขตข้อมูลที่คุณต้องการเติมลงในตารางฐานข้อมูล

เช่น

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

เมื่อ laravel ตรวจพบว่าคุณกำลังกำหนดข้อมูลจำนวนมากมันจะบังคับให้คุณกำหนดเขตข้อมูลที่คุณต้องการกำหนดจำนวนมากในคลาสโมเดล

บางคนสามารถส่งข้อมูลที่ไม่ต้องการไปยังแบบฟอร์ม html ไปยังฐานข้อมูลของคุณได้อย่างง่ายดาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.