Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

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

เข้าถึงกฎความปลอดภัยของ Firebase

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

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

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

ทำความเข้าใจกฎความปลอดภัยของ Firebase

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

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

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

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

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

เมื่อคุณตั้งค่าโปรเจ็กต์ 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;
    }
  }
}

ฐานข้อมูลเรียลไทม์

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

การจัดเก็บเมฆ

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

ฐานข้อมูลเรียลไทม์

การจัดเก็บเมฆ

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

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

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

Cloud Firestore

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

ฐานข้อมูลเรียลไทม์

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

การจัดเก็บเมฆ

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

ฐานข้อมูลเรียลไทม์

การจัดเก็บเมฆ

(ฐานข้อมูลเรียลไทม์) กฎที่สืบทอดมาอย่างไม่เหมาะสม

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

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

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

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

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

ฐานข้อมูลเรียลไทม์

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

การจัดเก็บเมฆ

// 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 และวิธีการทำงานใน เริ่มต้นใช้งานกฎความปลอดภัยของ Cloud Firestore

ทดสอบกฎความปลอดภัย Cloud Firestore ของคุณ

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

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