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

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

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

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

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

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

แอปที่ทำงานด้วยระบบ 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

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

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