ใช้คู่มือนี้เพื่อทำความเข้าใจช่องโหว่ที่พบได้ทั่วไปในการกำหนดค่า 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 FirestoreRealtime DatabaseCloud Storage |
สิทธิ์เข้าถึงของผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
บางครั้ง Rules จะตรวจสอบว่าผู้ใช้เข้าสู่ระบบแล้ว แต่ไม่ดำเนินการเพิ่มเติม
จำกัดการเข้าถึงตามการตรวจสอบสิทธิ์นั้น หากกฎข้อใดข้อหนึ่งประกอบด้วย
auth != null
ยืนยันว่าคุณต้องการให้ผู้ใช้ที่เข้าสู่ระบบทุกคนมีสิทธิ์เข้าถึง
ไม่แนะนำ: ผู้ใช้ที่ลงชื่อเข้าสู่ระบบได้อ่านแล้ว
และเข้าถึงฐานข้อมูลทั้งหมด
Cloud Firestoreservice 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 FirestoreRealtime DatabaseCloud 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