FixVibe
Covered by FixVibehigh

การรักษาความปลอดภัย Next.js + Supabase: การป้องกันบายพาสระดับแถว (RLS)

แอปพลิเคชันที่สร้างด้วย Next.js และ Supabase มักจะอาศัย Row Level Security (RLS) เพื่อปกป้องข้อมูล ความล้มเหลวในการเปิดใช้งาน RLS หรือการกำหนดค่าไคลเอนต์ Supabase ไม่ถูกต้องอาจทำให้เกิดการเปิดเผยฐานข้อมูลเต็มรูปแบบ ทำให้ผู้ใช้ที่ไม่ได้รับอนุญาตสามารถอ่านหรือแก้ไขบันทึกที่ละเอียดอ่อนได้

CWE-284

ผลกระทบ

ผู้โจมตีสามารถข้ามตรรกะของแอปพลิเคชันเพื่ออ่าน อัปเดต หรือลบบันทึกในฐานข้อมูลได้ หากการรักษาความปลอดภัยระดับแถว (RLS) ไม่ได้บังคับใช้อย่างถูกต้อง [S1] ซึ่งมักส่งผลให้มีการเปิดเผยข้อมูลส่วนบุคคล (PII) หรือข้อมูลแอปพลิเคชันที่ละเอียดอ่อนต่อผู้ใช้ที่มีสิทธิ์เข้าถึงเฉพาะคีย์ API ที่ไม่เปิดเผยตัวตนแบบสาธารณะเท่านั้น

ต้นเหตุ

Supabase ใช้ Postgres Row Level Security เพื่อจัดการการเข้าถึงข้อมูลในระดับฐานข้อมูล ซึ่งเป็นพื้นฐานสำหรับการรักษาความปลอดภัยข้อมูล [S1] ในสภาพแวดล้อม Next.js นักพัฒนาจะต้องสร้างไคลเอ็นต์ Supabase ที่จัดการคุกกี้และเซสชันได้อย่างถูกต้อง เพื่อรักษาความปลอดภัยในระหว่างการเรนเดอร์ฝั่งเซิร์ฟเวอร์ ZXCVFIXVIBTOKEN1ZXCV ช่องโหว่มักเกิดขึ้นเมื่อ:

  • ตารางถูกสร้างขึ้นโดยไม่เปิดใช้งาน RLS ทำให้สามารถเข้าถึงได้ผ่านคีย์อานนท์สาธารณะ ZXCVFIXVIBTOKEN0ZXCV
  • ไคลเอนต์ Supabase ได้รับการกำหนดค่าอย่างไม่ถูกต้องใน Next.js ซึ่งไม่สามารถส่งโทเค็นการรับรองความถูกต้องของผู้ใช้ไปยังฐานข้อมูล ZXCVFIXVIBTOKEN0ZXCV ได้อย่างถูกต้อง
  • นักพัฒนาใช้คีย์ service_role โดยไม่ได้ตั้งใจในโค้ดฝั่งไคลเอ็นต์ ซึ่งข้ามนโยบาย ZXCVFIXVIBTOKEN2ZXCV ทั้งหมด ZXCVFIXVIBTOKEN1ZXCV

การแก้ไขคอนกรีต

  • เปิดใช้งาน ZXCVFIXVIBTOKEN2ZXCV: ตรวจสอบให้แน่ใจว่าการรักษาความปลอดภัยระดับแถวถูกเปิดใช้งานสำหรับทุกตารางในฐานข้อมูล ZXCVFIXVIBTOKEN1ZXCV ของคุณ [S1]
  • กำหนดนโยบาย: สร้างนโยบาย Postgres เฉพาะสำหรับการดำเนินการ SELECT, INSERT, UPDATE และ DELETE เพื่อจำกัดการเข้าถึงตาม UID [S1] ของผู้ใช้
  • ใช้ไคลเอ็นต์ SSR: ใช้แพ็คเกจ @supabase/ssr เพื่อสร้างไคลเอนต์ใน Next.js ที่จัดการการตรวจสอบสิทธิ์ฝั่งเซิร์ฟเวอร์และการคงอยู่ของเซสชันอย่างถูกต้อง ZXCVFIXVIBTOKEN1ZXCV

วิธีทดสอบ FixVibe

FixVibe ครอบคลุมเรื่องนี้แล้วผ่านการตรวจสอบแอปที่ปรับใช้และ repo โมดูล baas.supabase-rls แบบพาสซีฟจะค้นหา URL ของ Supabase และคู่ที่ไม่ใช่คีย์จากบันเดิล JavaScript ที่มีต้นกำเนิดเดียวกัน ขอ PostgREST สำหรับข้อมูลเมตาของตารางสาธารณะ และดำเนินการเลือกอ่านอย่างเดียวแบบจำกัดเพื่อยืนยันการเปิดเผยข้อมูลที่ไม่ระบุตัวตน โดยไม่เปลี่ยนแปลงข้อมูลลูกค้า การสแกน Repo ยังเรียกใช้ repo.supabase.missing-rls เพื่อตั้งค่าสถานะการย้ายข้อมูล SQL ที่สร้างตารางสาธารณะโดยไม่มี ENABLE ROW LEVEL SECURITY และการสแกนแบบลับจะค้นหาการเปิดเผยคีย์บทบาทบริการก่อนที่จะเข้าถึงเบราว์เซอร์