หลีกเลี่ยงกฎที่ไม่ปลอดภัย

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

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

เข้าถึง Firebase Security Rules

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

หากต้องการเข้าถึงกฎจากคอนโซล Firebase ให้เลือก โปรเจ็กต์ จากนั้นไปที่ Realtime Database, Cloud Firestore หรือ พื้นที่เก็บข้อมูล คลิกกฎเมื่ออยู่ในฐานข้อมูลหรือพื้นที่เก็บข้อมูลที่ถูกต้องแล้ว

ในการเข้าถึงกฎจาก Firebase CLI ให้ไปที่ ในไฟล์กฎที่ระบุไว้ในไฟล์ firebase.json

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

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

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

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

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

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

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

ไม่แนะนำ: สิทธิ์อ่านและเขียนสำหรับ ผู้ใช้ทั้งหมด

Cloud Firestore

// 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;
    }
  }
}

Realtime Database

{
  // 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
  }
}
    

Cloud Storage

// 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 ดูข้อมูลเพิ่มเติม เกี่ยวกับการตรวจสอบสิทธิ์ผู้ใช้ด้วยกฎ

Cloud Firestore

Realtime Database

Cloud Storage

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

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

ไม่แนะนำ: ผู้ใช้ที่ลงชื่อเข้าสู่ระบบได้อ่านแล้ว และเข้าถึงฐานข้อมูลทั้งหมด

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

// 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;
    }
  }
}
โซลูชัน: จำกัดการเข้าถึงให้แคบลงโดยใช้การรักษาความปลอดภัย

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

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) กฎที่รับค่าเดิมอย่างไม่ถูกต้อง

การต่อแบบต่อเนื่อง Realtime Database Security Rules มีกฎที่ตื้นกว่าเส้นทางหลักจะลบล้างเส้นทางหลัก ระดับโหนดย่อยในระดับที่ลึกขึ้น เมื่อคุณเขียนกฎที่โหนดย่อย โปรดทราบว่า ว่าสามารถให้สิทธิ์เพิ่มเติมเท่านั้น คุณไม่สามารถปรับแต่งหรือเพิกถอน เข้าถึงข้อมูลได้ลึกขึ้นในฐานข้อมูล

ไม่แนะนำ: การปรับแต่งกฎในเส้นทางย่อย
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
วิธีแก้ไข: เขียนกฎที่เส้นทางระดับบนสุด ที่กว้างและให้สิทธิ์ที่เฉพาะเจาะจงมากขึ้นในเส้นทางย่อย หากต้องการการเข้าถึงข้อมูลแบบละเอียดยิ่งขึ้น ให้กำหนดกฎแบบละเอียด ดูข้อมูลเพิ่มเติมเกี่ยวกับการต่อเรียง Realtime Database Security Rules ใน แกน ไวยากรณ์ของ Realtime Database Security Rules

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

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

Cloud Firestore

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

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
    

Cloud Storage

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

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

ทดสอบ Cloud Firestore Security Rules

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

หากต้องการตรวจสอบ Firebase Security Rules อย่างรวดเร็วในคอนโซล Firebase โปรดใช้ เครื่องมือจำลองกฎของ Firebase