ใช้คู่มือนี้เพื่อทำความเข้าใจช่องโหว่ทั่วไปในการกำหนดค่ากฎความปลอดภัยของ Firebase ตรวจสอบและรักษาความปลอดภัยกฎของคุณเองให้ดียิ่งขึ้น และทดสอบการเปลี่ยนแปลงของคุณก่อนที่จะนำไปใช้งาน
หากคุณได้รับการแจ้งเตือนว่าข้อมูลของคุณไม่ได้รับการรักษาความปลอดภัยอย่างเหมาะสม ให้ตรวจสอบข้อผิดพลาดที่เกิดขึ้นโดยทั่วไปเหล่านี้และอัปเดตกฎที่มีช่องโหว่
เข้าถึงกฎความปลอดภัยของ Firebase ของคุณ
หากต้องการดูกฎที่มีอยู่ ให้ใช้ Firebase CLI หรือคอนโซล Firebase ตรวจสอบให้แน่ใจว่าคุณแก้ไขกฎของคุณโดยใช้วิธีการเดียวกันอย่างสม่ำเสมอ เพื่อหลีกเลี่ยงการเขียนทับการอัปเดตโดยไม่ได้ตั้งใจ หากคุณไม่แน่ใจว่ากฎที่กำหนดไว้ในเครื่องของคุณสะท้อนถึงการอัปเดตล่าสุดหรือไม่ คอนโซล Firebase จะแสดงกฎความปลอดภัยของ Firebase เวอร์ชันล่าสุดที่ใช้งานล่าสุดเสมอ
หากต้องการเข้าถึงกฎของคุณจาก คอนโซล Firebase ให้เลือกโปรเจ็กต์ของคุณ จากนั้นไปที่ Realtime Database , Cloud Firestore หรือ Storage คลิก กฎ เมื่อคุณอยู่ในฐานข้อมูลหรือที่เก็บข้อมูลที่ถูกต้อง
หากต้องการเข้าถึงกฎของคุณจาก Firebase CLI ให้ไปที่ไฟล์กฎที่ระบุไว้ใน ไฟล์ firebase.json
ทำความเข้าใจกฎความปลอดภัยของ Firebase
กฎความปลอดภัยของ Firebase ปกป้องข้อมูลของคุณจากผู้ใช้ที่เป็นอันตราย เมื่อคุณสร้างอินสแตนซ์ฐานข้อมูลหรือที่เก็บข้อมูล Cloud Storage ในคอนโซล Firebase คุณสามารถเลือกปฏิเสธการเข้าถึงของผู้ใช้ทั้งหมด ( โหมดล็อก ) หรือให้สิทธิ์การเข้าถึงแก่ผู้ใช้ทั้งหมด ( โหมดทดสอบ ) แม้ว่าคุณอาจต้องการการกำหนดค่าที่เปิดกว้างมากขึ้นในระหว่างการพัฒนา แต่อย่าลืมใช้เวลาในการกำหนดค่ากฎของคุณอย่างเหมาะสมและรักษาความปลอดภัยข้อมูลของคุณก่อนที่จะปรับใช้แอปของคุณ
ขณะที่คุณกำลังพัฒนาแอปและทดสอบการกำหนดค่าต่างๆ สำหรับกฎของคุณ ให้ใช้ โปรแกรมจำลอง Firebase ในเครื่องตัวใด ตัวหนึ่งเพื่อเรียกใช้แอปของคุณในสภาพแวดล้อมการพัฒนาในเครื่อง
สถานการณ์ทั่วไปที่มีกฎที่ไม่ปลอดภัย
กฎที่คุณอาจตั้งไว้ตามค่าเริ่มต้นหรือในขณะที่คุณเริ่มพัฒนาแอปของคุณควรได้รับการตรวจสอบและอัปเดตก่อนที่คุณจะปรับใช้แอปของคุณ ตรวจสอบให้แน่ใจว่าคุณรักษาความปลอดภัยข้อมูลผู้ใช้ของคุณอย่างเหมาะสมโดยหลีกเลี่ยงข้อผิดพลาดทั่วไปต่อไปนี้
เปิดการเข้าถึง
เมื่อคุณตั้งค่าโปรเจ็กต์ Firebase คุณอาจตั้งกฎเพื่ออนุญาตการเข้าถึงแบบเปิดในระหว่างการพัฒนา คุณอาจคิดว่าคุณเป็นคนเดียวที่ใช้แอปของคุณ แต่หากคุณใช้งานแอปนั้น แอปจะพร้อมใช้งานบนอินเทอร์เน็ต หากคุณไม่ได้ตรวจสอบสิทธิ์ผู้ใช้และกำหนดค่ากฎความปลอดภัย ใครก็ตามที่เดารหัสโปรเจ็กต์ของคุณจะสามารถขโมย แก้ไข หรือลบข้อมูลได้
ไม่แนะนำ: สิทธิ์การอ่านและเขียนสำหรับผู้ใช้ทุกคน คลาวด์ไฟร์สโตร์// Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } ฐานข้อมูลเรียลไทม์{ // Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. "rules": { ".read": true, ".write": true } } การจัดเก็บเมฆ// Anyone can read or write to the bucket, even non-users of your app. // Because it is shared with App Engine, this will also make // files uploaded via App Engine public. // Warning: This rule makes every file in your Cloud Storage bucket accessible to any user. // Apply caution before using it in production, since it means anyone // can overwrite all your files. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write; } } } |
วิธีแก้ไข: กฎที่จำกัดการเข้าถึงแบบอ่านและเขียน สร้างกฎที่เหมาะสมสำหรับลำดับชั้นข้อมูลของคุณ หนึ่งในวิธีแก้ปัญหาทั่วไปสำหรับความไม่ปลอดภัยนี้คือการรักษาความปลอดภัยตามผู้ใช้ด้วย Firebase Authentication เรียนรู้เพิ่มเติมเกี่ยวกับ การตรวจสอบสิทธิ์ผู้ใช้ด้วยกฎ คลาวด์ไฟร์สโตร์ฐานข้อมูลเรียลไทม์การจัดเก็บเมฆ |
การเข้าถึงสำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง
บางครั้งกฎจะตรวจสอบว่าผู้ใช้เข้าสู่ระบบแล้ว แต่ไม่ได้จำกัดการเข้าถึงเพิ่มเติมตามการรับรองความถูกต้องนั้น หากกฎข้อใดข้อหนึ่งของคุณมี auth != null
ให้ยืนยันว่าคุณต้องการให้ผู้ใช้ที่เข้าสู่ระบบสามารถเข้าถึงข้อมูลได้
ไม่แนะนำ: ผู้ใช้ที่เข้าสู่ระบบมีสิทธิ์อ่านและเขียนฐานข้อมูลทั้งหมดของคุณ คลาวด์ไฟร์สโตร์service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth.uid != null; } } } ฐานข้อมูลเรียลไทม์{ "rules": { ".read": "auth.uid !== null", ".write": "auth.uid !== null" } } การจัดเก็บเมฆ// Only authenticated users can read or write to the bucket service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } } |
วิธีแก้ไข: การเข้าถึงที่แคบโดยใช้เงื่อนไขความปลอดภัย เมื่อคุณตรวจสอบการตรวจสอบสิทธิ์ คุณอาจต้องการใช้คุณสมบัติการตรวจสอบสิทธิ์อย่างใดอย่างหนึ่งเพื่อจำกัดการเข้าถึงเฉพาะผู้ใช้สำหรับชุดข้อมูลเฉพาะเพิ่มเติม เรียนรู้เพิ่มเติมเกี่ยวกับ คุณสมบัติการรับรองความถูกต้อง ต่างๆ คลาวด์ไฟร์สโตร์ฐานข้อมูลเรียลไทม์การจัดเก็บเมฆ |
(ฐานข้อมูลเรียลไทม์) กฎที่สืบทอดมาอย่างไม่เหมาะสม
กฎการรักษาความปลอดภัยของฐานข้อมูลแบบเรียลไทม์เรียงซ้อน โดยมีกฎที่ตื้นกว่า เส้นทางพาเรนต์จะแทนที่กฎที่โหนดลูกที่อยู่ลึกกว่า เมื่อคุณเขียนกฎที่โหนดย่อย โปรดจำไว้ว่ากฎนั้นสามารถให้สิทธิ์เพิ่มเติมได้เท่านั้น คุณไม่สามารถปรับแต่งหรือเพิกถอนการเข้าถึงข้อมูลในเส้นทางที่ลึกกว่าในฐานข้อมูลของคุณได้
ไม่แนะนำ: การปรับแต่งกฎที่เส้นทางลูก{ "rules": { "foo": { // allows read to /foo/* ".read": "data.child('baz').val() === true", "bar": { /* ignored, since read was allowed already */ ".read": false } } } } |
วิธีแก้ไข: เขียนกฎที่พาธพาเรนต์แบบกว้าง และให้สิทธิ์เฉพาะเจาะจงมากขึ้นที่พาธย่อย หากความต้องการการเข้าถึงข้อมูลของคุณต้องการรายละเอียดที่ละเอียดมากขึ้น ให้รักษากฎของคุณแบบละเอียด เรียนรู้เพิ่มเติมเกี่ยวกับกฎการรักษาความปลอดภัยของฐานข้อมูลแบบเรียลไทม์แบบเรียงซ้อนใน รูปแบบหลักของกฎการรักษาความปลอดภัยของฐานข้อมูลแบบเรียลไทม์ |
การเข้าถึงแบบปิด
ในขณะที่คุณกำลังพัฒนาแอป วิธีการทั่วไปอีกวิธีหนึ่งคือการล็อคข้อมูลของคุณ โดยทั่วไป หมายความว่าคุณได้ปิดการเข้าถึงแบบอ่านและเขียนสำหรับผู้ใช้ทั้งหมดแล้ว ดังนี้:
คลาวด์ไฟร์สโตร์
// Deny read/write access to all users under any conditions service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
ฐานข้อมูลเรียลไทม์
{ "rules": { ".read": false, ".write": false } }
การจัดเก็บเมฆ
// Access to files through Cloud Storage is completely disallowed. // Files may still be accessible through App Engine or Google Cloud Storage APIs. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if false; } } }
Firebase Admin SDK และฟังก์ชันคลาวด์ยังคงสามารถเข้าถึงฐานข้อมูลของคุณได้ ใช้กฎเหล่านี้เมื่อคุณตั้งใจจะใช้ Cloud Firestore หรือฐานข้อมูลเรียลไทม์เป็นแบ็กเอนด์แบบเซิร์ฟเวอร์เท่านั้นร่วมกับ Firebase Admin SDK แม้ว่าจะปลอดภัย แต่คุณควรทดสอบว่าไคลเอ็นต์ของแอปสามารถดึงข้อมูลได้อย่างถูกต้อง
เรียนรู้เพิ่มเติมเกี่ยวกับกฎความปลอดภัยของ Cloud Firestore และวิธีการทำงานใน การเริ่มต้นใช้งานกฎความปลอดภัยของ Cloud Firestore
ทดสอบกฎความปลอดภัยของ Cloud Firestore ของคุณ
หากต้องการตรวจสอบพฤติกรรมของแอปและยืนยันการกำหนดค่ากฎความปลอดภัยของ Cloud Firestore ให้ใช้ Firebase Emulator ใช้โปรแกรมจำลอง Cloud Firestore เพื่อเรียกใช้และทำให้การทดสอบหน่วยเป็นแบบอัตโนมัติในสภาพแวดล้อมภายในเครื่องก่อนที่คุณจะปรับใช้การเปลี่ยนแปลงใดๆ
หากต้องการตรวจสอบกฎความปลอดภัย Firebase อย่างรวดเร็วในคอนโซล Firebase ให้ใช้ Firebase Rules Simulator