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 cấu trúc dữ liệu của bạn và những chỉ mục 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 quy tắc của bạn cho phép. Theo mặc định, 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 nhằm 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 JavaScript và có bốn loại:

Các loại quy tắc
.đọc Mô tả liệu và khi nào dữ liệu được phép đọc bởi người dùng.
.viết Mô tả liệu và khi nào dữ liệu được phép ghi.
.xác nhận 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 và kiểu dữ liệu hay không.
.indexBật Chỉ định một phần tử con để lập chỉ mục nhằm hỗ trợ việc sắp xếp 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 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 bạn dễ dàng xác thực người dùng, thực thi quyền của người dùng và xác thực thông tin đầu vào.

Các ứng dụng được hỗ trợ bởi Firebase chạy nhiều mã phía máy khách hơn 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 thường làm.

Xác thực

Bước đầu tiên phổ biến để bảo mật ứng dụng của bạn là xác định người dùng. 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ợ đăng nhập 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ó những khả năng khác nhau. Ví dụ: trong ứ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ọ chứ không phải tin nhắn do người dùng khác đăng.

Ủy quyền

Việc 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 có 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 của 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 xếp tầng, vì vậy 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ư mọi đường dẫn sâu 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, vì vậy quyền truy cập đọc vào /foo/bar/baz vẫn sẽ được cấp trong ví dụ này ngay cả khi 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à hàm tích hợp cho phép bạn tham chiếu đến 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ó sơ đồ. Đ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 thì điều quan trọng là dữ liệu phải luôn 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 các 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à đúng để được phép ghi.

Các quy tắc này bắt 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 điều 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 của bạn, danh tính người dùng, thời gian máy chủ, 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 kích thước dữ liệu nhỏ, cơ sở dữ liệu hỗ trợ truy vấn đặc biệt, do đó, các chỉ mục thường không được yêu cầu trong quá trình phát triển. Tuy nhiên, trước khi khởi chạy ứng dụng, đ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 mẫu 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