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

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

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

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

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

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

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

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

ขั้นตอนแรกทั่วไปในการรักษาความปลอดภัยแอปของคุณคือการระบุผู้ใช้ของคุณ กระบวนการนี้เรียกว่า การรับรองความถูกต้อง คุณสามารถใช้ การตรวจสอบสิทธิ์ Firebase เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณได้ การตรวจสอบสิทธิ์ 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 Authentication

{
  "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"]
    }
  }
}

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