Quy tắc bảo mật của Cơ sở dữ liệu theo thời gian thực Firebase xác định những người có quyền đọc và ghi vào cơ sở dữ liệu, cấu trúc dữ liệu và các chỉ mục hiện có. 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, 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. 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ả liệu người dùng có được phép đọc dữ liệu hay không và khi nào được phép. |
.write | Mô tả trường hợp và trường hợp được phép ghi dữ liệu. |
.validate | 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ề khả năng bảo mật của Realtime Database
Firebase Realtime Database cung cấp một bộ công cụ đầy đủ để quản lý tính bảo mật của ứng dụng. Các 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 chạy bằng Firebase chạy nhiều mã phía máy khách hơn so với các ứ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ể khác một chút so với những gì bạn quen dùng.
Xác thực
Bước đầu tiên phổ biến để bảo mật ứng dụng 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 tính năng Xác thực Firebase để yêu cầu người dùng đăng nhập vào ứng dụng của bạn. Tính năng Xác thực Firebase bao gồm tính năng hỗ trợ tích hợ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 bằng email và mật khẩu, đăng nhập ẩn danh và nhiều tính năng khác.
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 đó. 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. Sau khi biết được những người này, 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. Quy tắc bảo mật của 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 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
và .write
được áp dụng theo kiểu thác nước, vì vậy, bộ quy tắc này cấp quyền đọc cho mọi dữ liệu 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 .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. Dưới đây là ví dụ về một quy tắc cấp quyền ghi cho người dùng đã xác thực vào /users/<uid>/
, trong đó <uid> là mã nhận dạng của người dùng được lấy thông qua Firebase Authentication.
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
Xác thực dữ liệu
Firebase Realtime Database 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
và .write
. Điểm khác biệt duy nhất là các quy tắc xác thực không được áp dụng theo kiểu lũy thừa, 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 để cho phép ghi.
Các quy tắc này thực thi rằng dữ liệu được ghi vào /foo/
phải là một chuỗi có ít 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 sẵn giống như quy tắc .read
và .write
. Bạn có thể sử dụng các giá trị 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 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
Firebase Realtime Database cho phép sắp xếp 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, vì vậy, các chỉ mục thường không bắt buộc trong quá trình phát triển. Tuy nhiên, trước khi chạy ứng dụng, bạn cần chỉ định chỉ mục cho mọi truy vấn để đảm bảo các chỉ mục đó tiếp tục hoạt động khi ứng dụng 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
- Bắt đầu lập kế hoạch phát triển quy tắc cho cơ sở dữ liệu của bạn.
- Tìm hiểu thêm về cách bảo mật dữ liệu bằng các quy tắc bảo mật.
- Tìm hiểu thêm về cách chỉ định chỉ mục bằng quy tắc.