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

กฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase จะกำหนดผู้ที่มีสิทธิ์อ่านและเขียนในบัญชี ฐานข้อมูล โครงสร้างข้อมูล และดัชนีที่มีอยู่ กฎเหล่านี้จะอยู่ในเซิร์ฟเวอร์ Firebase และบังคับใช้โดยอัตโนมัติตลอดเวลา ทุกการอ่าน และคำขอเขียนจะสมบูรณ์ก็ต่อเมื่อกฎของคุณอนุญาตเท่านั้น โดยค่าเริ่มต้น กฎจะไม่อนุญาตให้บุคคลใดเข้าถึงฐานข้อมูลของคุณ ทั้งนี้เพื่อปกป้อง ฐานข้อมูลจากการละเมิดจนกว่าคุณจะมีเวลาปรับแต่งกฎหรือตั้งค่า การตรวจสอบสิทธิ์

กฎความปลอดภัยของฐานข้อมูลเรียลไทม์มีไวยากรณ์ที่คล้ายกับ JavaScript และมี 4 ประเภทดังนี้

ประเภทของกฎ
.read อธิบายว่าอนุญาตให้ผู้ใช้อ่านข้อมูลหรือไม่และเมื่อใด
.write อธิบายว่าอนุญาตให้เขียนข้อมูลได้หรือไม่และเมื่อใด
.validate กำหนดลักษณะของค่าที่มีการจัดรูปแบบอย่างถูกต้อง ไม่ว่าจะมีแอตทริบิวต์ย่อยหรือไม่ และประเภทข้อมูล
.indexOn ระบุรายการย่อยที่จะจัดทำดัชนีเพื่อรองรับการสั่งซื้อและการค้นหา

ภาพรวมด้านความปลอดภัยของ Realtime Database

Firebase Realtime Database มีเครื่องมือแบบครบครันสำหรับการจัดการ ด้านความปลอดภัยของแอป เครื่องมือเหล่านี้ช่วยให้ ตรวจสอบสิทธิ์ผู้ใช้ได้ง่าย บังคับใช้การให้สิทธิ์จากผู้ใช้ และตรวจสอบความถูกต้องของอินพุต

แอปที่ทำงานด้วยระบบ Firebase เรียกใช้โค้ดฝั่งไคลเอ็นต์มากกว่าแอปที่มีอื่นๆ Technology Stack ดังนั้น แนวทางที่เราใช้ในการรักษาความปลอดภัย ต่างจากที่คุณคุ้นเคย

การตรวจสอบสิทธิ์

ขั้นตอนแรกๆ ที่พบได้ทั่วไปในการทำให้แอปปลอดภัยคือการระบุผู้ใช้ กระบวนการนี้เรียกว่าการตรวจสอบสิทธิ์ คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปได้ การตรวจสอบสิทธิ์ Firebase รองรับเมธอดการตรวจสอบสิทธิ์ทั่วไป เช่น Google และ Facebook รวมถึงการเข้าสู่ระบบด้วยอีเมลและรหัสผ่าน การเข้าสู่ระบบโดยไม่ระบุตัวตน และอื่นๆ

ข้อมูลประจำตัวของผู้ใช้เป็นแนวคิดด้านความปลอดภัยที่สำคัญ ผู้ใช้แต่ละคนมี ข้อมูล โดยในบางครั้งก็มีความสามารถที่แตกต่างกัน เช่น ในแชท แต่ละข้อความจะเชื่อมโยงกับผู้ใช้ที่สร้างข้อความนั้น ผู้ใช้ ยังสามารถลบข้อความของตนเอง แต่ไม่ลบข้อความที่โพสต์โดยบุคคลอื่นๆ ผู้ใช้

การให้สิทธิ์

การระบุผู้ใช้เป็นเพียงส่วนหนึ่งของการรักษาความปลอดภัยเท่านั้น เมื่อคุณทราบว่าพวกเขาเป็นใคร คุณ ต้องการวิธีควบคุมการเข้าถึงข้อมูลในฐานข้อมูลของคุณ กฎความปลอดภัยของ Realtime Database ช่วยให้คุณควบคุมสิทธิ์การเข้าถึงของผู้ใช้แต่ละรายได้ ตัวอย่างเช่น นี่คือชุดของ กฎความปลอดภัยที่อนุญาตให้ทุกคนอ่านเส้นทาง /foo/ ได้ แต่ เพื่อเขียนถึง:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

กฎ Cascade ของ .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"]
    }
  }
}

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