Hiểu các quy tắc bảo mật cơ sở dữ liệu thời gian thực của Firebase

Quy tắc bảo mật cơ sở dữ liệu thời gian thực của Firebase xác định ai có quyền truy cập đọc và ghi vào cơ sở dữ liệu của bạn, cách dữ liệu của bạn được cấu trúc và chỉ mục nào tồn tại. Các quy tắc này tồn tại trên máy chủ Firebase và luôn được thực thi tự động. Mọi yêu cầu đọc và ghi sẽ chỉ được hoàn thành nếu các quy tắc của bạn cho phép. Theo mặc định, các quy tắc của bạn không cho phép bất kỳ ai truy cập vào cơ sở dữ liệu của bạn. Điều này là để bảo vệ cơ sở dữ liệu của bạn khỏi bị lạm dụng cho đến khi bạn có thời gian để tùy chỉnh các quy tắc của mình hoặc thiết lập xác thực.

Quy tắc bảo mật cơ sở dữ liệu thời gian thực có cú pháp giống như JavaScript và có bốn loại:

Loại quy tắc
.đọc Mô tả nếu và khi nào dữ liệu được phép đọc bởi người dùng.
.viết Mô tả nếu và khi nào dữ liệu được phép ghi.
.xác thực Xác định giá trị được định dạng chính xác sẽ trông như thế nào, liệu giá trị đó có thuộc tính con hay không và loại dữ liệu.
.indexOn Chỉ định một phần tử con để lập chỉ mục để hỗ trợ đặt hàng và truy vấn.

Tổng quan về bảo mật cơ sở dữ liệu thời gian thực

Cơ sở dữ liệu thời gian thực Firebase cung cấp một bộ công cụ đầy đủ để quản lý tính bảo mật cho ứng dụng của bạn. Những công cụ này giúp dễ dàng xác thực người dùng của bạn, thực thi quyền của người dùng và xác thực đầu vào.

Các ứng dụng do Firebase cung cấp chạy nhiều mã phía máy khách hơn so với những ứng dụng có nhiều ngăn xếp công nghệ khác. Do đó, cách chúng tôi tiếp cận vấn đề bảo mật có thể hơi khác so với cách bạn đã từng sử dụng.

xác thực

Bước đầu tiên phổ biến trong việc bảo mật ứng dụng của bạn là xác định người dùng của bạn. Quá trình này được gọi là xác thực . Bạn có thể sử dụng Xác thực Firebase để yêu cầu người dùng đăng nhập vào ứng dụng của mình. Xác thực Firebase bao gồm hỗ trợ thả vào cho các phương thức xác thực phổ biến như Google và Facebook, cũng như đăng nhập email và mật khẩu, đăng nhập ẩn danh, v.v.

Danh tính người dùng là một khái niệm bảo mật quan trọng. Những người dùng khác nhau có dữ liệu khác nhau và đôi khi họ có các khả năng khác nhau. Ví dụ: trong một ứng dụng trò chuyện, mỗi tin nhắn được liên kết với người dùng đã tạo ra nó. Người dùng cũng có thể xóa tin nhắn của chính họ, nhưng không thể xóa tin nhắn do người dùng khác đăng.

ủy quyền

Xác định người dùng của bạn chỉ là một phần của bảo mật. Khi bạn biết họ là ai, bạn cần một cách để kiểm soát quyền truy cập của họ vào dữ liệu trong cơ sở dữ liệu của bạn. Quy tắc bảo mật cơ sở dữ liệu thời gian thực cho phép bạn kiểm soát quyền truy cập cho từng người dùng. Ví dụ: đây là một bộ quy tắc bảo mật cho phép mọi người đọc đường dẫn /foo/ nhưng không ai ghi vào đó:

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

Các quy tắc .read.write nối tiếp nhau, do đó, bộ quy tắc này cấp quyền truy cập đọc vào bất kỳ dữ liệu nào tại đường dẫn /foo/ cũng như bất kỳ đường dẫn sâu hơn nào, chẳng hạn như /foo/bar/baz . Lưu ý rằng các quy tắc .read.write nông hơn trong cơ sở dữ liệu sẽ ghi đè các quy tắc sâu hơn, do đó, quyền truy cập đọc tới /foo/bar/baz sẽ vẫn được cấp trong ví dụ này ngay cả khi một quy tắc tại đường dẫn /foo/bar/baz được đánh giá là sai.

Quy tắc bảo mật cơ sở dữ liệu thời gian thực bao gồm các biến và chức năng tích hợp sẵn cho phép bạn tham khảo các đường dẫn khác, dấu thời gian phía máy chủ, thông tin xác thực, v.v. Dưới đây là ví dụ về quy tắc cấp quyền truy cập ghi cho người dùng được xác thực vào /users/<uid>/ , trong đó <uid> là ID của người dùng có được thông qua Xác thực Firebase.

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

Xác nhận dữ liệu

Cơ sở dữ liệu thời gian thực Firebase không có lược đồ. Điều này giúp bạn dễ dàng thay đổi mọi thứ khi phát triển nhưng khi ứng dụng của bạn đã sẵn sàng phân phối, điều quan trọng là dữ liệu phải nhất quán. Ngôn ngữ quy tắc bao gồm quy tắc .validate cho phép bạn áp dụng logic xác thực bằng cách sử dụng cùng biểu thức được sử dụng cho quy tắc .read.write . Sự khác biệt duy nhất là các quy tắc xác thực không xếp tầng , vì vậy tất cả các quy tắc xác thực có liên quan phải đánh giá là true để cho phép ghi.

Các quy tắc này buộc dữ liệu được ghi vào /foo/ phải là một chuỗi nhỏ hơn 100 ký tự:

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

Quy tắc xác thực có quyền truy cập vào tất cả các hàm và biến tích hợp giống như quy tắc .read.write . Bạn có thể sử dụng những quy tắc này để tạo quy tắc xác thực nhận biết dữ liệu ở nơi khác trong cơ sở dữ liệu, danh tính người dùng, thời gian máy chủ của bạn, v.v.

Xác định chỉ mục cơ sở dữ liệu

Cơ sở dữ liệu thời gian thực Firebase cho phép đặt hàng và truy vấn dữ liệu. Đối với các kích thước dữ liệu nhỏ, cơ sở dữ liệu hỗ trợ truy vấn đặc biệt, vì vậy các chỉ mục thường không cần thiết trong quá trình phát triển. Tuy nhiên, trước khi khởi chạy ứng dụng của bạn, điều quan trọng là phải chỉ định các chỉ mục cho bất kỳ truy vấn nào bạn có để đảm bảo chúng tiếp tục hoạt động khi ứng dụng của bạn phát triển.

Các chỉ mục được chỉ định bằng quy tắc .indexOn . Dưới đây là một khai báo chỉ mục ví dụ sẽ lập chỉ mục các trường chiều cao và chiều dài cho danh sách khủng long:

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

Bước tiếp theo