Hãy sử dụng hướng dẫn này để tìm hiểu các lỗ hổng thường gặp trong cấu hình Cloud Firestore Security Rules, xem xét và bảo mật tốt hơn các quy tắc của riêng bạn, đồng thời kiểm thử các thay đổi trước khi triển khai.
Nếu nhận được cảnh báo rằng cơ sở dữ liệu Cloud Firestore của bạn không được bảo mật đúng cách, bạn có thể giải quyết các lỗ hổng bằng cách sửa đổi và kiểm thử Cloud Firestore Security Rules.
Để xem các Quy tắc bảo mật hiện có, hãy chuyển đến thẻ Quy tắc trong bảng điều khiển Firebase.
Tìm hiểu về Cloud Firestore Security Rules
Cloud Firestore Security Rules bảo vệ dữ liệu của bạn khỏi người dùng độc hại. Các quy tắc mặc định cho mọi thực thể Cloud Firestore được tạo trong bảng điều khiển Firebase sẽ từ chối quyền truy cập cho tất cả người dùng. Để phát triển ứng dụng và truy cập vào cơ sở dữ liệu, bạn cần sửa đổi các quy tắc đó và có thể cân nhắc cấp quyền truy cập chung cho tất cả người dùng trong môi trường phát triển. Tuy nhiên, trước khi triển khai ứng dụng của bạn sang môi trường phát hành công khai, hãy dành thời gian để định cấu hình đúng cách các quy tắc và bảo mật dữ liệu của bạn.
Khi bạn đang phát triển ứng dụng và kiểm thử nhiều cấu hình cho các quy tắc, hãy sử dụng trình mô phỏng Cloud Firestore để chạy ứng dụng trong môi trường phát triển cục bộ.
Các trường hợp phổ biến có quy tắc không an toàn
Bạn nên xem xét và cập nhật Cloud Firestore Security Rules mà bạn có thể đã thiết lập theo mặc định hoặc khi bạn bắt đầu phát triển ứng dụng bằng Cloud Firestore trước khi triển khai ứng dụng. Hãy đảm bảo bạn bảo mật đúng cách dữ liệu của người dùng bằng cách tránh những sai lầm thường gặp sau đây.
Truy cập mở
Khi thiết lập Cloud Firestore, bạn có thể đã đặt quy tắc cho phép quyền truy cập mở trong quá trình phát triển. Bạn có thể nghĩ rằng bạn là người duy nhất sử dụng ứng dụng của mình, nhưng nếu bạn đã triển khai ứng dụng, thì ứng dụng đó sẽ có trên Internet. Nếu bạn không xác thực người dùng và định cấu hình các quy tắc bảo mật, thì bất kỳ ai đoán được mã dự án của bạn đều có thể đánh cắp, sửa đổi hoặc xoá dữ liệu.
Không nên dùng: Quyền đọc và ghi cho tất cả người dùng. |
// Allow read/write access to all users under any conditions // Warning: **NEVER** use this rule set in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
Giải pháp: Các quy tắc hạn chế quyền đọc và ghi.
Xây dựng các quy tắc phù hợp với hệ phân cấp dữ liệu của bạn. Một trong những giải pháp phổ biến cho vấn đề bảo mật này là bảo mật dựa trên người dùng bằng Firebase Authentication. Tìm hiểu thêm về cách xác thực người dùng bằng quy tắc. |
Chỉ dành cho chủ sở hữu nội dung
service cloud.firestore { match /databases/{database}/documents { // Allow only authenticated content owners access match /some_collection/{document} { // Allow reads and deletion if the current user owns the existing document allow read, delete: if request.auth.uid == resource.data.author_uid; // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; } } }
Quyền truy cập kết hợp công khai và riêng tư
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { // Allow public reads allow read: if true // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; // Allow deletion if the current user owns the existing document allow delete: if request.auth.uid == resource.data.author_uid; } } }
Quyền truy cập cho mọi người dùng đã xác thực
Đôi khi, Cloud Firestore Security Rules kiểm tra để đảm bảo người dùng đã đăng nhập, nhưng không hạn chế thêm quyền truy cập dựa trên thông tin xác thực đó. Nếu một trong các quy tắc của bạn bao gồm auth != null
, hãy xác nhận rằng bạn muốn mọi người dùng đã đăng nhập đều có quyền truy cập vào dữ liệu.
Không nên dùng: Mọi người dùng đã đăng nhập đều có quyền đọc và ghi vào toàn bộ cơ sở dữ liệu của bạn. |
service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth != null; } } }
Giải pháp: Hạn chế quyền truy cập bằng các điều kiện bảo mật.
Khi kiểm tra việc xác thực, bạn cũng nên sử dụng một trong các thuộc tính xác thực để hạn chế thêm quyền truy cập của một số người dùng cụ thể đối với một số tập dữ liệu cụ thể. Tìm hiểu thêm về cách thêm điều kiện bảo mật và quyền truy cập dựa trên vai trò. |
Quyền truy cập dựa trên vai trò
service cloud.firestore { match /databases/{database}/documents { // Assign roles to all users and refine access based on user roles match /some_collection/{document} { allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader" allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer" // Note: Checking for roles in your database using `get` (as in the code // above) or `exists` carry standard charges for read operations. } } }
Quyền truy cập dựa trên thuộc tính
// Give each user in your database a particular attribute // and set it to true/false // Then, use that attribute to grant access to subsets of data // For example, an "admin" attribute set // to "true" grants write access to data service cloud.firestore { match /databases/{database}/documents { match /collection/{document} { allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; allow read: true; } } }
Quyền truy cập kết hợp công khai và riêng tư
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { allow read: if true allow write: if request.auth.uid == request.resource.data.author_uid } } }
Đã đóng quyền truy cập
Trong khi phát triển ứng dụng, bạn cũng có thể áp dụng một phương pháp phổ biến khác là khoá dữ liệu. Thông thường, điều này có nghĩa là bạn đã tắt quyền đọc và ghi cho tất cả người dùng như sau:
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
SDK Quản trị Firebase và Cloud Functions vẫn có thể truy cập vào cơ sở dữ liệu của bạn. Hãy sử dụng các quy tắc này khi bạn dự định sử dụng Cloud Firestore làm phần phụ trợ chỉ dành cho máy chủ cùng với SDK quản trị Firebase. Mặc dù ứng dụng này an toàn, nhưng bạn nên kiểm tra để đảm bảo ứng dụng của bạn có thể truy xuất dữ liệu đúng cách.
Tìm hiểu thêm về Cloud Firestore Security Rules và cách hoạt động của các lớp này trong phần Bắt đầu với Cloud Firestore Security Rules.
Kiểm tra Cloud Firestore Security Rules của bạn
Để kiểm tra hành vi của ứng dụng và xác minh cấu hình Cloud Firestore Security Rules, hãy sử dụng trình mô phỏng Cloud Firestore. Sử dụng trình mô phỏng Cloud Firestore để chạy và tự động hoá kiểm thử đơn vị trong môi trường cục bộ trước khi triển khai bất kỳ thay đổi nào.
Để nhanh chóng kiểm thử Cloud Firestore Security Rules đã cập nhật trong bảng điều khiển Firebase, hãy sử dụng công cụ Rules Playground (Sân chơi quy tắc).
- Để mở Rules Playground, hãy nhấp vào Rules playground (Khu vui chơi quy tắc) trong thẻ Rules (Quy tắc).
- Trong phần cài đặt Rules playground (Sân chơi quy tắc), hãy chọn các tuỳ chọn cho kiểm thử, bao gồm:
- Kiểm thử lượt đọc hoặc ghi
- Một Vị trí cụ thể trong cơ sở dữ liệu của bạn, dưới dạng một đường dẫn
- Loại xác thực – người dùng ẩn danh chưa xác thực, người dùng ẩn danh đã xác thực hoặc một mã nhận dạng người dùng cụ thể
- Dữ liệu dành riêng cho tài liệu mà quy tắc của bạn tham chiếu cụ thể (ví dụ: nếu quy tắc của bạn yêu cầu phải có một trường cụ thể trước khi cho phép ghi)
- Nhấp vào Run (Chạy) rồi tìm kết quả trong biểu ngữ phía trên cửa sổ quy tắc.