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

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

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

เข้าถึง Firebase Security Rules

หากต้องการดู Rules ที่มีอยู่ ให้ใช้ Firebase CLI หรือคอนโซล 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 แบบเรียงซ้อนในไวยากรณ์ Core ของ 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โปรแกรมจําลองเพื่อเรียกใช้และทําการทดสอบหน่วยแบบอัตโนมัติในสภาพแวดล้อมภายในก่อนที่จะทําการเปลี่ยนแปลง

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