แก้ไขกฎที่ไม่ปลอดภัย

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

หากคุณได้รับการแจ้งเตือนว่าฐานข้อมูล Cloud Firestore ของคุณไม่ได้รับการรักษาความปลอดภัยอย่างเหมาะสม คุณสามารถแก้ไขช่องโหว่ได้โดยการแก้ไขและทดสอบกฎความปลอดภัยของ Cloud Firestore

หากต้องการดูกฎความปลอดภัยที่มีอยู่ ให้ไปที่ แท็บกฎ ในคอนโซล Firebase

ทำความเข้าใจกฎความปลอดภัยของ Cloud Firestore ของคุณ

กฎความปลอดภัยของ Cloud Firestore ปกป้องข้อมูลของคุณจากผู้ใช้ที่เป็นอันตราย กฎเริ่มต้นสำหรับอินสแตนซ์ Cloud Firestore ที่สร้างในคอนโซล Firebase จะปฏิเสธการเข้าถึงของผู้ใช้ทั้งหมด ในการพัฒนาแอปและเข้าถึงฐานข้อมูลของคุณ คุณจะต้องแก้ไขกฎเหล่านั้น และอาจพิจารณาให้สิทธิ์การเข้าถึงแบบครอบคลุมแก่ผู้ใช้ทั้งหมดในสภาพแวดล้อมการพัฒนา อย่างไรก็ตาม ก่อนที่จะปรับใช้แอปของคุณกับสภาพแวดล้อมการใช้งานจริง โปรดใช้เวลาในการกำหนดค่ากฎของคุณอย่างเหมาะสมและรักษาความปลอดภัยข้อมูลของคุณ

ขณะที่คุณกำลังพัฒนาแอปและทดสอบการกำหนดค่าต่างๆ สำหรับกฎของคุณ ให้ใช้ โปรแกรมจำลอง Cloud Firestore เพื่อเรียกใช้แอปของคุณในสภาพแวดล้อมการพัฒนาในเครื่อง

สถานการณ์ทั่วไปที่มีกฎที่ไม่ปลอดภัย

กฎความปลอดภัยของ Cloud Firestore ที่คุณอาจตั้งค่าไว้ตามค่าเริ่มต้นหรือในขณะที่คุณเริ่มพัฒนาแอปด้วย Cloud Firestore ควรได้รับการตรวจสอบและอัปเดตก่อนที่คุณจะปรับใช้แอปของคุณ ตรวจสอบให้แน่ใจว่าคุณรักษาความปลอดภัยข้อมูลผู้ใช้ของคุณอย่างเหมาะสมโดยหลีกเลี่ยงข้อผิดพลาดทั่วไปต่อไปนี้

เปิดการเข้าถึง

เมื่อคุณตั้งค่า Cloud Firestore คุณอาจตั้งกฎเพื่ออนุญาตการเข้าถึงแบบเปิดในระหว่างการพัฒนา คุณอาจคิดว่าคุณเป็นคนเดียวที่ใช้แอปของคุณ แต่หากคุณใช้งานแอปนั้น แอปจะพร้อมใช้งานบนอินเทอร์เน็ต หากคุณไม่ได้ตรวจสอบสิทธิ์ผู้ใช้และกำหนดค่ากฎความปลอดภัย ใครก็ตามที่เดารหัสโปรเจ็กต์ของคุณจะสามารถขโมย แก้ไข หรือลบข้อมูลได้

ไม่แนะนำ: สิทธิ์การอ่านและเขียนสำหรับผู้ใช้ทุกคน
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
วิธีแก้ไข: กฎที่จำกัดการเข้าถึงแบบอ่านและเขียน

สร้างกฎที่เหมาะสมสำหรับลำดับชั้นข้อมูลของคุณ หนึ่งในวิธีแก้ปัญหาทั่วไปสำหรับความไม่ปลอดภัยนี้คือการรักษาความปลอดภัยตามผู้ใช้ด้วย Firebase Authentication เรียนรู้เพิ่มเติมเกี่ยวกับ การตรวจสอบสิทธิ์ผู้ใช้ด้วยกฎ

เจ้าของเนื้อหาเท่านั้น

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

การเข้าถึงแบบสาธารณะและส่วนตัวแบบผสมผสาน

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

การเข้าถึงสำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง

บางครั้ง กฎความปลอดภัยของ Cloud Firestore จะตรวจสอบว่าผู้ใช้เข้าสู่ระบบแล้ว แต่ไม่ได้จำกัดการเข้าถึงเพิ่มเติมตามการตรวจสอบสิทธิ์นั้น หากกฎข้อใดข้อหนึ่งของคุณมี auth != null ให้ยืนยันว่าคุณต้องการให้ผู้ใช้ที่เข้าสู่ระบบสามารถเข้าถึงข้อมูลได้

ไม่แนะนำ: ผู้ใช้ที่เข้าสู่ระบบมีสิทธิ์อ่านและเขียนฐานข้อมูลทั้งหมดของคุณ
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
วิธีแก้ไข: การเข้าถึงที่แคบโดยใช้เงื่อนไขความปลอดภัย

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

การเข้าถึงตามบทบาท

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

การเข้าถึงตามคุณสมบัติ

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

การเข้าถึงแบบสาธารณะและส่วนตัวแบบผสมผสาน

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

การเข้าถึงแบบปิด

ในขณะที่คุณกำลังพัฒนาแอป วิธีการทั่วไปอีกวิธีหนึ่งคือการล็อคข้อมูลของคุณ โดยทั่วไป หมายความว่าคุณได้ปิดการเข้าถึงแบบอ่านและเขียนสำหรับผู้ใช้ทั้งหมดแล้ว ดังนี้:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK และฟังก์ชันคลาวด์ยังคงสามารถเข้าถึงฐานข้อมูลของคุณได้ ใช้กฎเหล่านี้เมื่อคุณตั้งใจจะใช้ Cloud Firestore เป็นแบ็กเอนด์เฉพาะเซิร์ฟเวอร์ร่วมกับ Firebase Admin SDK แม้ว่าจะปลอดภัย แต่คุณควรทดสอบว่าไคลเอ็นต์ของแอปสามารถดึงข้อมูลได้อย่างถูกต้อง

เรียนรู้เพิ่มเติมเกี่ยวกับกฎความปลอดภัยของ Cloud Firestore และวิธีการทำงานใน การเริ่มต้นใช้งานกฎความปลอดภัยของ Cloud Firestore

ตรวจสอบกฎความปลอดภัยของ Cloud Firestore ของคุณ

หากต้องการตรวจสอบพฤติกรรมของแอปและยืนยันการกำหนดค่ากฎความปลอดภัยของ Cloud Firestore ให้ใช้ โปรแกรมจำลอง Cloud Firestore ใช้โปรแกรมจำลอง Cloud Firestore เพื่อเรียกใช้และทำให้การทดสอบหน่วยเป็นแบบอัตโนมัติในสภาพแวดล้อมภายในเครื่องก่อนที่คุณจะปรับใช้การเปลี่ยนแปลงใดๆ

หากต้องการทดสอบกฎความปลอดภัยของ Cloud Firestore ที่อัปเดตอย่างรวดเร็วในคอนโซล Firebase ให้ใช้เครื่องมือ Rules Playground

  1. หากต้องการเปิด Rules Playground ให้คลิก Rules Playground จาก แท็บกฎ
  2. ในการตั้งค่า สนามเด็กเล่นกฎ ให้เลือกตัวเลือกสำหรับการทดสอบของคุณ ได้แก่:
    • การทดสอบการอ่านหรือเขียน
    • ตำแหน่ง เฉพาะในฐานข้อมูลของคุณเป็นเส้นทาง
    • ประเภทการตรวจสอบสิทธิ์ — ผู้ใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์ ผู้ใช้ที่ไม่ระบุชื่อที่ได้รับการตรวจสอบสิทธิ์ หรือ ID ผู้ใช้เฉพาะ
    • ข้อมูลเฉพาะเอกสารที่กฎของคุณอ้างอิงโดยเฉพาะ (เช่น หากกฎของคุณต้องการฟิลด์เฉพาะก่อนที่จะอนุญาตให้เขียนได้)
  3. คลิก เรียกใช้ และค้นหาผลลัพธ์ในแบนเนอร์เหนือหน้าต่างกฎ