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

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

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

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

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

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

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

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

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

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

การให้สิทธิ์

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

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

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

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

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

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

Firebase Realtime Database เป็นแบบไม่มีสคีมา ทำให้เปลี่ยนแปลงสิ่งต่างๆ ได้ง่าย ระหว่างการพัฒนา แต่เมื่อแอปพร้อมจัดจำหน่ายแล้ว เพื่อให้ข้อมูลมีความสม่ำเสมอ ภาษาของกฎจะมี .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"]
    }
  }
}

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