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