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

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

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

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

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

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

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

การรับรองความถูกต้อง

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

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

การอนุญาต

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

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

กฎเรียงซ้อนของกฎ .read และ .write ดังนั้นชุดกฎนี้จึงให้สิทธิ์การอ่านข้อมูลใดๆ ที่เส้นทาง /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 ข้อแตกต่างเพียงอย่างเดียวคือ กฎการตรวจสอบความถูกต้องจะไม่เรียงซ้อน ดังนั้นกฎการตรวจสอบความถูกต้องที่เกี่ยวข้องทั้งหมดต้องประเมินค่าเป็นจริงจึงจะอนุญาตให้เขียนได้

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

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

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

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

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

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

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

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