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

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

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

เข้าถึง Firebase Security Rules

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

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

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

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

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

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

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

คุณควรตรวจสอบและอัปเดต Security 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 using 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

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

บางครั้งSecurity 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 โปรแกรมจำลองเพื่อเรียกใช้และทำการทดสอบหน่วยโดยอัตโนมัติในสภาพแวดล้อมในเครื่องก่อนที่จะทำให้ การเปลี่ยนแปลงใดๆ ใช้งานได้

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