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

ใช้คู่มือนี้เพื่อทำความเข้าใจช่องโหว่ที่พบได้ทั่วไปในการกำหนดค่า 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. คลิกเรียกใช้ แล้วดูผลลัพธ์ในแบนเนอร์เหนือหน้าต่างกฎ