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

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

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

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

ทำความเข้าใจCloud Firestore Security Rules

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

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

สถานการณ์ที่พบบ่อยซึ่งมีกฎที่ไม่ปลอดภัย

Cloud Firestore Security Rules ที่คุณอาจตั้งค่าไว้โดยค่าเริ่มต้นหรือตามที่คุณได้เริ่มพัฒนาแอปด้วย 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 reads and deletion if the current user owns the existing document
      allow read, delete: if request.auth.uid == resource.data.author_uid;
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == 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 public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}
  

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

บางครั้ง Cloud Firestore Security Rules จะตรวจสอบว่าผู้ใช้เข้าสู่ระบบแล้ว แต่อย่าจำกัดการเข้าถึงตามการตรวจสอบสิทธิ์นั้นเพิ่มเติม หากกฎข้อใดข้อหนึ่งมี 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 Functions จะยังเข้าถึงฐานข้อมูลได้อยู่ ใช้กฎเหล่านี้เมื่อคุณต้องการใช้ Cloud Firestore เป็นแบ็กเอนด์แบบเซิร์ฟเวอร์เท่านั้นร่วมกับ Firebase Admin SDK แม้ว่าจะปลอดภัย แต่คุณก็ควรทดสอบว่าไคลเอ็นต์ของแอปสามารถเรียกข้อมูลได้อย่างถูกต้อง

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Cloud Firestore Security Rules และวิธีการทํางานในหัวข้อเริ่มต้นใช้งาน Cloud Firestore Security Rules

ตรวจสอบ Cloud Firestore Security Rules

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

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

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