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

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

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

หากต้องการความช่วยเหลือจาก AI ให้คัดลอกพรอมต์ด้านล่างลงใน เอเจนต์การเขียนโค้ด AI (เช่น Gemini ใน Android Studio, Antigravity, Claude Code, Codex และ Cursor) คุณปรับแต่งพรอมต์และทำซ้ำกับเอเจนต์ได้ ดูข้อมูลการติดตั้งโดยละเอียดได้ที่ ทักษะเอเจนต์ Firebase

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's data.

เข้าถึง Firebase Security Rules

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

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

หากต้องการเข้าถึงกฎจาก 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 Emulator ใช้Cloud Firestore โปรแกรมจำลองเพื่อเรียกใช้และทำให้การทดสอบหน่วยเป็นแบบอัตโนมัติในสภาพแวดล้อมภายในก่อนที่จะนำการเปลี่ยนแปลงไปใช้งาน

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