ทำความเข้าใจกฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase

กฎความปลอดภัยสำหรับฐานข้อมูลเรียลไทม์ของ 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"]
    }
  }
}

ขั้นตอนถัดไป