Tìm hiểu các Quy tắc bảo mật cơ sở dữ liệu theo thời gian thực của Firebase

Quy tắc bảo mật cơ sở dữ liệu theo thời gian thực của Firebase xác định ai có quyền đọc và ghi vào dữ liệu của bạn cơ sở dữ liệu, cách dữ liệu của bạn được cấu trúc và những chỉ mục nào tồn tại. Các quy tắc này đã có hiệu lực trên máy chủ Firebase và luôn được thực thi tự động. Mỗi lần đọc và yêu cầu ghi sẽ chỉ được hoàn tất 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. Việc này nhằm bảo vệ 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 hoặc thiết lập xác thực.

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

Loại quy tắc
.đọc Mô tả trường hợp và trường hợp người dùng được phép đọc dữ liệu.
.write Mô tả trường hợp và trường hợp được phép ghi dữ liệu.
xác thực Xác định hình thức hiển thị của một giá trị được định dạng chính xác, cho dù giá trị đó có các thuộc tính con và kiểu dữ liệu.
.indexOn Chỉ định một thành phần con để lập chỉ mục nhằm hỗ trợ việc sắp xếp và truy vấn.

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

Cơ sở dữ liệu theo thời gian thực của Firebase cung cấp một bộ công cụ đầy đủ để quản lý tính bảo mật của ứng dụng. 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 dữ liệu đầu vào.

Các ứng dụng dựa trên Firebase chạy mã phía máy khách nhiều hơn so với các ứng dụng có nhiều ứng dụng khác bộ phần mềm cơ sở. Do đó, cách chúng tôi tiếp cận vấn đề bảo mật có thể hơi khác với những gì bạn vẫn thường làm.

Xác thực

Bước đầu tiên phổ biến để bảo mật ứng dụng là xác định danh tí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 tính năng Xác thực Firebase có người dùng đăng nhập vào ứng dụng của bạn. Xác thực Firebase bao gồm hỗ trợ thả xuống 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à hơn thế nữa.

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 và đôi khi chúng có những khả năng khác nhau. Ví dụ: trong một cuộc trò chuyện thì mỗi thông báo sẽ được liên kết với người dùng đã tạo thông báo đó. Số người dùng cũng có thể xoá thư của chính họ, nhưng không thể xoá thư do người khác đăng người dùng.

Ủy quyền

Việc nhận dạng người dùng chỉ là một phần của quá trình bảo mật. Khi đã 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 cho cơ sở dữ liệu theo 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 tập hợp quy tắc bảo mật cho phép mọi người đọc đường dẫn /foo/, nhưng không một URL để ghi vào đó:

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

Các quy tắc .read.write phân tầng, do đó, bộ quy tắc này cấp quyền đọc mọi dữ liệu tại đường dẫn /foo/ cũng như mọi dữ liệu sâu hơn đường dẫn như /foo/bar/baz. Lưu ý rằng .read và Các quy tắc .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 trong ví dụ này vẫn sẽ được cấp quyền đọc /foo/bar/baz ngay cả khi một quy tắc tại đường dẫn /foo/bar/baz được đánh giá là false.

Quy tắc bảo mật cho cơ sở dữ liệu theo thời gian thực bao gồm biến tích hợp và các hàm 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à nhiều lợi ích khác. Sau đây là ví dụ về quy tắc cấp quyền ghi cho người dùng đã xác thực sang /users/<uid>/, trong đó <uid> là mã nhận dạng của người dùng có được thông qua tính năng Xác thực Firebase.

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

Xác thực dữ liệu

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

Các quy tắc này thực thi việc dữ liệu được ghi vào /foo/ phải là một chuỗi dưới 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 chức năng được tích hợp sẵn và biến dưới dạng quy tắc .read.write. Bạn có thể dùng để tạo các quy tắc xác thực nhận biết dữ liệu ở những nơi khác trong cơ sở dữ liệu, danh tính của người dùng, thời gian máy chủ và nhiều thông tin khác.

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

Cơ sở dữ liệu theo thời gian thực của Firebase cho phép sắp xếp và truy vấn dữ liệu. Đối với dữ liệu nhỏ kích thước, cơ sở dữ liệu hỗ trợ truy vấn đặc biệt, nên 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 ra mắt ứng dụng, để chỉ định 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 giúp ứng dụng của bạn phát triển.

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

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

Các bước tiếp theo