กฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase จะกำหนดผู้ที่มีสิทธิ์อ่านและเขียนฐานข้อมูลของคุณ โครงสร้างข้อมูล และดัชนีที่มีอยู่ กฎเหล่านี้จะอยู่ในเซิร์ฟเวอร์ Firebase และบังคับใช้โดยอัตโนมัติตลอดเวลา คำขออ่านและเขียนทั้งหมดจะดำเนินการเสร็จสมบูรณ์ก็ต่อเมื่อกฎของคุณอนุญาต โดยค่าเริ่มต้น กฎของคุณไม่อนุญาตให้ผู้อื่นเข้าถึงฐานข้อมูลของคุณ การดำเนินการนี้เพื่อปกป้องฐานข้อมูลจากการละเมิดจนกว่าคุณจะมีเวลาปรับแต่งกฎหรือตั้งค่าการตรวจสอบสิทธิ์
กฎความปลอดภัยของฐานข้อมูลแบบเรียลไทม์มีไวยากรณ์ที่คล้ายกับ JavaScript และมี 4 ประเภทดังนี้
ประเภทของกฎ | |
---|---|
.read | อธิบายว่าอนุญาตให้ผู้ใช้อ่านข้อมูลหรือไม่และเมื่อใด |
.write | อธิบายว่าระบบอนุญาตให้เขียนข้อมูลหรือไม่และเมื่อใด |
.validate | กำหนดลักษณะของค่าที่มีรูปแบบถูกต้อง ไม่ว่าจะมีแอตทริบิวต์ย่อยหรือไม่ และประเภทข้อมูล |
.indexOn | ระบุรายการย่อยที่จะจัดทําดัชนีเพื่อรองรับการจัดเรียงและการค้นหา |
ภาพรวมความปลอดภัยของ Realtime Database
Firebase Realtime Database มีชุดเครื่องมือที่สมบูรณ์สำหรับจัดการความปลอดภัยของแอป เครื่องมือเหล่านี้ช่วยให้การตรวจสอบสิทธิ์ผู้ใช้ บังคับใช้สิทธิ์ของผู้ใช้ และตรวจสอบอินพุตเป็นเรื่องง่าย
แอปที่ทำงานด้วยระบบ Firebase เรียกใช้โค้ดฝั่งไคลเอ็นต์มากกว่าแอปที่มีสแต็กเทคโนโลยีอื่นๆ มากมาย ดังนั้น แนวทางที่เราใช้รักษาความปลอดภัยจึงอาจแตกต่างจากที่คุณคุ้นเคย
การตรวจสอบสิทธิ์
ขั้นตอนแรกๆ ที่พบได้ทั่วไปในการทำให้แอปปลอดภัยคือการระบุผู้ใช้ กระบวนการนี้เรียกว่าการตรวจสอบสิทธิ์ คุณสามารถใช้ Firebase Authentication เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปได้ Firebase Authentication รองรับเมธอดการตรวจสอบสิทธิ์ทั่วไป เช่น Google และ Facebook รวมถึงการเข้าสู่ระบบด้วยอีเมลและรหัสผ่าน การเข้าสู่ระบบแบบไม่ระบุตัวตน และอื่นๆ
ข้อมูลประจำตัวของผู้ใช้เป็นแนวคิดด้านความปลอดภัยที่สำคัญ ผู้ใช้แต่ละคนมีข้อมูลที่แตกต่างกัน และบางครั้งก็อาจมีความสามารถที่แตกต่างกัน เช่น ในแอปพลิเคชันแชท แต่ละข้อความจะเชื่อมโยงกับผู้ใช้ที่สร้างข้อความนั้น ผู้ใช้อาจลบข้อความของตนเองได้ แต่จะลบข้อความที่ผู้ใช้รายอื่นโพสต์ไม่ได้
การให้สิทธิ์
การระบุผู้ใช้เป็นเพียงส่วนหนึ่งของการรักษาความปลอดภัย เมื่อทราบตัวตนของผู้ใช้แล้ว คุณจะต้องมีวิธีควบคุมการเข้าถึงข้อมูลในฐานข้อมูล กฎความปลอดภัยของ Realtime Database ช่วยให้คุณควบคุมการเข้าถึงของผู้ใช้แต่ละรายได้ ตัวอย่างเช่น ชุดกฎการรักษาความปลอดภัยที่อนุญาตให้ทุกคนอ่านเส้นทาง /foo/
แต่ไม่ให้เขียนข้อมูลในเส้นทางมีดังนี้
{ "rules": { "foo": { ".read": true, ".write": false } } }
กฎแบบต่อเนื่องของ .read
และ .write
ดังนั้นชุดกฎนี้ให้สิทธิ์การเข้าถึงเพื่ออ่านข้อมูลที่เส้นทาง /foo/
รวมถึงเส้นทางที่ลึกกว่า เช่น /foo/bar/baz
โปรดทราบว่ากฎ .read
และ .write
ในฐานข้อมูลจะมีค่าอันดับต่ำกว่ากฎที่ลึกกว่า ดังนั้นตัวอย่างนี้จึงยังให้สิทธิ์อ่าน /foo/bar/baz
อยู่ แม้ว่ากฎที่เส้นทาง /foo/bar/baz
จะเป็นค่าเท็จก็ตาม
กฎความปลอดภัยของฐานข้อมูลเรียลไทม์ประกอบด้วยตัวแปรในตัว
ฟังก์ชันต่างๆ ที่ให้คุณอ้างอิงถึงเส้นทางอื่นๆ การประทับเวลาฝั่งเซิร์ฟเวอร์ ข้อมูลการตรวจสอบสิทธิ์ และอื่นๆ ได้
ต่อไปนี้คือตัวอย่างกฎที่ให้สิทธิ์การเขียนสำหรับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ใน /users/<uid>/
โดยที่ <uid> คือรหัสของผู้ใช้ที่ได้ผ่าน Firebase Authentication
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
การตรวจสอบข้อมูล
Firebase Realtime Database เป็นแบบไม่มีสคีมา วิธีนี้ช่วยให้คุณเปลี่ยนแปลงสิ่งต่างๆ ได้ง่ายขณะพัฒนาแอป แต่เมื่อแอปพร้อมเผยแพร่แล้ว ข้อมูลจะต้องสอดคล้องกัน ภาษาของกฎประกอบด้วยกฎ .validate
ซึ่งช่วยให้คุณใช้ตรรกะการตรวจสอบโดยใช้นิพจน์เดียวกับที่ใช้สำหรับกฎ .read
และ .write
ได้ ความแตกต่างเพียงอย่างเดียวคือกฎการตรวจสอบจะไม่ทํางานแบบตามลําดับชั้น ดังนั้นกฎการตรวจสอบที่เกี่ยวข้องทั้งหมดต้องประเมินเป็น "จริง" เพื่อให้ระบบอนุญาตการเขียน
กฎเหล่านี้บังคับให้ข้อมูลที่เขียนลงใน /foo/
ต้องเป็นสตริงที่มีอักขระไม่เกิน 100 ตัว
{ "rules": { "foo": { ".validate": "newData.isString() && newData.val().length < 100" } } }
กฎการตรวจสอบมีสิทธิ์เข้าถึงฟังก์ชันและตัวแปรในตัวทั้งหมดเหมือนกับกฎ .read
และ .write
คุณสามารถใช้ข้อมูลเหล่านี้เพื่อสร้างกฎการตรวจสอบที่ทราบข้อมูลอื่นๆ ในฐานข้อมูล ข้อมูลประจำตัวของผู้ใช้ เวลาของเซิร์ฟเวอร์ และอื่นๆ อีกมากมาย
การกำหนดดัชนีฐานข้อมูล
Firebase Realtime Database อนุญาตการจัดลำดับและการค้นหาข้อมูล สําหรับข้อมูลขนาดเล็ก ฐานข้อมูลรองรับการค้นหาเฉพาะกิจ ดังนั้นโดยทั่วไปจึงไม่จําเป็นต้องใช้ดัชนีในระหว่างการพัฒนา อย่างไรก็ตาม ก่อนเปิดตัวแอป คุณควรระบุดัชนีสำหรับคำค้นหาเพื่อให้ทำงานต่อไปได้เมื่อแอปเติบโตขึ้น
ระบุดัชนีโดยใช้กฎ .indexOn
ต่อไปนี้คือตัวอย่างการประกาศดัชนีที่จะจัดทำดัชนีฟิลด์ความสูงและความยาวสำหรับรายการไดโนเสาร์
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
ขั้นตอนถัดไป
- เริ่มต้นวางแผนการพัฒนากฎสําหรับฐานข้อมูล
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการรักษาความปลอดภัยให้ข้อมูลโดยใช้กฎการรักษาความปลอดภัย
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการระบุดัชนีโดยใช้กฎ