Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

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

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

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

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

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

การอนุญาต

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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