Check out what’s new from Firebase at Google I/O 2022. Learn more

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

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

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

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

ภาพรวมความปลอดภัยของฐานข้อมูลเรียลไทม์

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

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

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

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

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

การอนุญาต

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

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

.read และ .write กฎ cascade ดังนั้น ruleset นี้จึงอนุญาตให้อ่านข้อมูลใดๆ ที่ path /foo/ รวมถึงเส้นทางที่ลึกกว่า เช่น /foo/bar/baz โปรดทราบว่ากฎ . .read และ .write ตื้นกว่าในฐานข้อมูลจะแทนที่กฎที่ลึกกว่า ดังนั้น การเข้าถึงแบบอ่านสำหรับ /foo/bar/baz จะยังคงได้รับในตัวอย่างนี้ แม้ว่ากฎที่พาธ /foo/bar/baz จะประเมินเป็นเท็จก็ตาม

กฎการรักษาความปลอดภัยฐานข้อมูลแบบเรียลไทม์ประกอบด้วย ตัวแปรและฟังก์ชันในตัว ที่ช่วยให้คุณอ้างอิงเส้นทางอื่นๆ การประทับเวลาฝั่งเซิร์ฟเวอร์ ข้อมูลการตรวจสอบสิทธิ์ และอื่นๆ นี่คือตัวอย่างของกฎที่ให้สิทธิ์ในการเขียนสำหรับผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว /users/<uid>/ โดยที่ <uid> คือ ID ของผู้ใช้ที่ได้รับผ่านการตรวจสอบสิทธิ์ Firebase

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

การตรวจสอบข้อมูล

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

กฎเหล่านี้บังคับใช้ว่าข้อมูลที่เขียนไปยัง /foo/ ต้องเป็นสตริงที่น้อยกว่า 100 อักขระ:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

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

การกำหนดดัชนีฐานข้อมูล

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

ดัชนีถูกระบุโดยใช้กฎ . .indexOn นี่คือตัวอย่างการประกาศดัชนีที่จะจัดทำดัชนีฟิลด์ความสูงและความยาวสำหรับรายชื่อไดโนเสาร์:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

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