Laravel Agent Kit: ให้ AI Agent เข้าถึงความสัมพันธ์ข้อมูล
วิธีให้ AI Agent เข้าถึงความสัมพันธ์ของโมเดลใน Laravel Agent Kit โดยไม่หลุดรอดการตรวจสอบสิทธิ์ ควบคุมความปลอดภัย ป้องกันการรั่วไหล

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การดึงข้อมูลความสัมพันธ์ต้องผ่านการตรวจสอบสิทธิ์ตามนโยบายของโมเดลเป้าหมาย
- ป้องกันการรั่วไหลด้วยการจำกัดให้เป้าหมายต้องลงทะเบียนเป็นทรัพยากรที่เปิดใช้งาน
- จำกัดการดึงข้อมูลเพียง 1 ฮอปต่อการเรียกใช้งาน เพื่อความโปร่งใสในบันทึกการตรวจสอบ
- ตรวจสอบการกำหนดค่าความสัมพันธ์ได้ตั้งแต่ช่วง deploy ผ่านฟังก์ชัน verify
เมื่อ AI agent สามารถอ่านข้อมูลโมเดลได้ ความต้องการขั้นต่อไปคือการเข้าถึงข้อมูลที่มีความเกี่ยวުރ้องกัน เช่น การเรียกดูตั๋ว (ticket) พร้อมความคิดเห็น (comments) และผู้เขียน (user) ซึ่งวิธีการทั่วไปมักใช้คำสั่งเช่น ->with($request->get('include')) ซึ่งเปรียบเสมือนการเปิดช่องทางให้ฐานข้อมูลถูกดึงออกไปได้ทั้งหมดหากมีการร้องขอ เนื่องจาก Eloquent จะยอมทำตามชื่อความสัมพันธ์ทุกชื่อที่ส่งเข้ามา ทำให้จากตั๋วสามารถโยงไปหาผู้ใช้ จากผู้ใช้โยงไปหาคำสั่งซื้อ และลุกลามไปได้เรื่อยๆ
ทางออกของปัญหานี้คือการจำกัดให้การขยายความสัมพันธ์ส่งคืนเฉพาะข้อมูลที่ถูกประกาศไว้ในแอตทริบิวต์ของตัวโมเดลความคิดเห็นเอง โดยต้องผ่านการตรวจสอบนโยบาย (policy) ของผู้ใช้งานที่เข้าสู่ระบบในขณะนั้น ไม่ใช่การใช้รายการฟิลด์หรือนโยบายของโมเดลแม่ และไม่มีโหมดความสัมพันธ์พิเศษที่ผ่อนปรนกฎเกณฑ์ลงแต่อย่างใด ดังนั้น สิ่งที่ agent มองเห็นผ่าน ticket.comments จึงเป็นสิ่งเดียวกับที่มันสามารถมองเห็นได้อยู่แล้วจากการเรียกดูความคิดเห็นโดยตรงผ่านเครื่องมือที่มีอยู่

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
นอกจากนี้ หากเป้าหมายไม่ได้ถูกลงทะเบียนไว้เป็นทรัพยากร (registered resource) คำขอจะถูกปฏิเสธทันที ตัวอย่างเช่น หากตั๋วประกาศให้ notes เป็นส่วนที่เข้าถึงได้ แต่ PrivateNote ไม่ได้ถูกลงทะเบียนไว้ ความสัมพันธ์นั้นจะไม่สามารถใช้เป็นช่องทางเข้าถึงโมเดลที่ไม่เคยถูกเปิดเผยได้ เพราะเป้าหมายจะต้องมีรายการฟิลด์และนโยบายของตัวเองเพื่อใช้บังคับใช้ความสิทธิ์
การออกแบบสิทธิ์ในลักษณะนี้ช่วยอุดช่องโหว่ความปลอดภัยที่มักเกิดขึ้นจากการประกาศความสัมพันธ์ในโค้ดเพียงบรรทัดเดียวแต่กลับเป็นการเปิดตารางข้อมูลทั้งหมดให้ภายนอกเข้าถึงโดยไม่รู้ตัว นักพัฒนาจึงควรตรวจสอบการตั้งค่าทรัพยากรและนโยบายการเข้าถึงข้อมูลของ AI ทุกครั้งที่มีการเพิ่มความสัมพันธ์ใหม่ๆ ในระบบ
ระบบยังมีการกำหนดข้อจำกัดที่น่าสนใจอื่นๆ อีก เช่น การขยายเรคอร์ดจะไม่ขยายความสัมพันธ์ต่อในตัว หาก agent ต้องการกระโดดไปยังขั้นถัดไป จะต้องทำการเรียกใช้งานเครื่องมือใหม่อีกครั้ง ซึ่งแต่ละฮอปจะถูกแยกการตรวจสอบสิทธิ์และบันทึกใน audit trail อย่างอิสระ การบังคับเช่นนี้ช่วยให้สามารถตอบคำถามได้ว่า agent อ่านข้อมูลอะไรไปบ้าง แทนที่จะปล่อยให้เป็นชุดข้อมูลขนาดมหึมาซ้อนกันหลายชั้น นอกจากนี้ความสัมพันธ์แบบ to-many จะต้องมีขีดจำกัดสูงสุดเพื่อป้องกันการดึงข้อมูลตารางขนาดใหญ่ เช่น ตั๋วที่มีความคิดเห็นถึง 4,000 รายการ โดยใช้เพดานที่กำหนดไว้จากฝั่งเป้าหมายไม่ใช่ฝั่งแม่
ในด้านประสิทธิภาพและการตรวจสอบความถูกต้อง ระบบจะทำการตรวจสอบชื่อความสัมพันธ์เทียบกับรายการที่ประกาศไว้ก่อนที่จะส่งต่อไปยัง with() เพื่อป้องกันไม่ให้มีการส่งค่าตามอำเภอใจเข้าไป และหากมีการกำหนดค่าความสัมพันธ์ผิดพลาด ระบบจะสามารถตรวจจับได้ตั้งแต่ช่วง deploy ผ่านคำสั่ง app(Registry::class)->verify() ซึ่งช่วยให้การทดสอบสามารถคัดกรองความผิดพลาดก่อนนำขึ้นใช้งานจริงได้
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น