กฎความปลอดภัยสำหรับฐานข้อมูลเรียลไทม์ของ Firebase จะกำหนดผู้ที่มีสิทธิ์เข้าถึงเพื่ออ่านและเขียนฐานข้อมูล โครงสร้างข้อมูล และดัชนีที่มีอยู่ กฎเหล่านี้จะอยู่ในเซิร์ฟเวอร์ของ Firebase และระบบจะบังคับใช้โดยอัตโนมัติตลอดเวลา คำขออ่านและเขียนจะเสร็จสมบูรณ์ก็ต่อเมื่อกฎของคุณอนุญาตเท่านั้น โดยค่าเริ่มต้น กฎของคุณจะไม่อนุญาตให้บุคคลใดเข้าถึงฐานข้อมูล ทั้งนี้เพื่อปกป้องฐานข้อมูลจากการละเมิดจนกว่าคุณจะมีเวลาปรับแต่งกฎหรือตั้งค่าการตรวจสอบสิทธิ์
กฎความปลอดภัยสำหรับ Realtime Database มีไวยากรณ์คล้ายกับ JavaScript และมี 4 ประเภทดังนี้
| ประเภทของกฎ | |
|---|---|
| .read | อธิบายว่าผู้ใช้ได้รับอนุญาตให้อ่านข้อมูลหรือไม่และเมื่อใด |
| .write | อธิบายว่าได้รับอนุญาตให้เขียนข้อมูลหรือไม่และเมื่อใด |
| .validate | กำหนดลักษณะของค่าที่จัดรูปแบบอย่างถูกต้อง ไม่ว่าจะมีแอตทริบิวต์ย่อยและประเภทข้อมูล |
| .indexOn | ระบุองค์ประกอบย่อยที่จะจัดทำดัชนีเพื่อรองรับการจัดลำดับและการค้นหา |
ภาพรวมด้านความปลอดภัยของ Realtime Database
Firebase Realtime Database มีชุดเครื่องมือครบวงจรสำหรับการจัดการ ความปลอดภัยของแอป เครื่องมือเหล่านี้ช่วยให้คุณตรวจสอบสิทธิ์ผู้ใช้ บังคับใช้สิทธิ์ของผู้ใช้ และตรวจสอบอินพุตได้อย่างง่ายดาย
แอปที่ขับเคลื่อนโดย Firebase จะเรียกใช้โค้ดฝั่งไคลเอ็นต์มากกว่าแอปที่มีเทคโนโลยีอื่นๆ มากมาย ดังนั้น แนวทางด้านความปลอดภัยของเราจึงอาจแตกต่างจากที่คุณคุ้นเคย
การตรวจสอบสิทธิ์
ขั้นตอนแรกที่พบบ่อยในการรักษาความปลอดภัยของแอปคือการระบุผู้ใช้ กระบวนการนี้เรียกว่า การตรวจสอบสิทธิ์ คุณสามารถใช้ การตรวจสอบสิทธิ์ Firebase เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปได้ การตรวจสอบสิทธิ์ Firebase มีการรองรับแบบดรอปอินสำหรับวิธีการตรวจสอบสิทธิ์ทั่วไป เช่น 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 จะประเมินเป็นเท็จก็ตาม
กฎความปลอดภัยสำหรับ Realtime Database มี
ตัวแปรในตัว
และฟังก์ชันที่ช่วยให้คุณ
อ้างอิงเส้นทางอื่นๆ การประทับเวลาฝั่งเซิร์ฟเวอร์ ข้อมูลการตรวจสอบสิทธิ์
และอื่นๆ ได้ ต่อไปนี้คือตัวอย่างกฎที่ให้สิทธิ์เข้าถึงเพื่อเขียนสำหรับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ไปยัง /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"]
}
}
}ขั้นตอนถัดไป
- เริ่มต้นวางแผนการพัฒนากฎสำหรับฐานข้อมูล
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการรักษาความปลอดภัยของข้อมูลโดยใช้กฎความปลอดภัย
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการระบุดัชนีโดยใช้กฎ