Hãy sử dụng hướng dẫn này để hiểu các lỗ hổng thường gặp trong Firebase Security Rules cấu hình, 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 bạn nhận được một cảnh báo rằng dữ liệu của bạn không được bảo mật đúng cách, hãy xem xét các lỗi thường gặp này và cập nhật mọi quy tắc dễ bị tấn công.
Truy cập vào Firebase Security Rules
Để xem các Security Rules hiện có, hãy sử dụng Firebase CLI hoặc Firebase console. Đảm bảo bạn chỉnh sửa các quy tắc của mình bằng cùng một phương thức, một cách nhất quán để tránh vô tình ghi đè các bản cập nhật. Nếu bạn không chắc liệu các quy tắc được xác định cục bộ có phản ánh các bản cập nhật gần đây nhất hay không, thì Bảng điều khiển Firebase luôn hiển thị phiên bản được triển khai gần đây nhất của Firebase Security Rules.
Để truy cập vào các quy tắc của bạn từ Firebase bảng điều khiển, hãy chọn dự án của bạn, sau đó chuyển đến Realtime Database, Cloud Firestore hoặc Storage. Nhấp vào Rules (Quy tắc) sau khi bạn vào đúng cơ sở dữ liệu hoặc vùng lưu trữ bucket.
Để truy cập vào các quy tắc của bạn từ Firebase CLI, hãy chuyển đến tệp quy tắc được ghi chú trong tệp firebase.json.
Tìm hiểu về Firebase Security Rules
Firebase Security Rules bảo vệ dữ liệu của bạn khỏi những người dùng độc hại. Khi tạo một thực thể cơ sở dữ liệu hoặc vùng lưu trữ Cloud Storage trong Bảng điều khiển Firebase, bạn có thể chọn từ chối quyền truy cập đối với tất cả người dùng (Chế độ khoá) hoặc cấp quyền truy cập cho tất cả người dùng (Chế độ kiểm thử). Mặc dù bạn có thể muốn một cấu hình mở hơn trong quá trình phát triển, nhưng hãy nhớ 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 trước khi triển khai ứng dụng.
Khi bạn đang phát triển ứng dụng và kiểm thử các cấu hình khác nhau cho các quy tắc, hãy sử dụng một trong các trình mô phỏng Firebase cục bộ để chạy ứng dụng trong môi trường phát triển cục bộ.
Các trường hợp thường gặp có quy tắc không an toàn
Bạn nên xem xét và cập nhật 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 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 lỗi thường gặp sau đây.
Quyền truy cập mở
Khi thiết lập dự án Firebase, bạn có thể đã đặt các 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 mình 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 truy cập đọc và ghi cho
tất cả người dùng.
Cloud Firestore// Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } Realtime Database{ // Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. "rules": { ".read": true, ".write": true } } Cloud Storage// Anyone can read or write to the bucket, even non-users of your app. // Because it is shared with App Engine, this will also make // files uploaded using App Engine public. // Warning: This rule makes every file in your Cloud Storage bucket accessible to any user. // Apply caution before using it in production, since it means anyone // can overwrite all your files. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write; } } } |
|
Giải pháp: Các quy tắc hạn chế quyền truy cập đọc và
ghi.
Xây dựng các quy tắc phù hợp với hệ thống 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 đề không an toàn 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 các quy tắc. Cloud FirestoreRealtime DatabaseCloud Storage |
Quyền truy cập cho bất kỳ người dùng nào đã xác thực
Đôi khi, Security Rules kiểm tra xem người dùng đã đăng nhập hay chưa, nhưng không hạn chế thêm
quyền truy cập dựa trên quá trình 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 bất kỳ người dùng nào đã đăng nhập đều có quyền truy cập vào
dữ liệu.
Không nên dùng: Bất kỳ người dùng nào đã đăng nhập đều có quyền truy cập đọc
và ghi vào toàn bộ cơ sở dữ liệu của bạn.
Cloud Firestoreservice cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth.uid != null; } } } Realtime Database{
"rules": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}Cloud Storage// Only authenticated users can read or write to the bucket service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } } |
(Realtime Database) Các quy tắc được kế thừa không đúng cách
Realtime Database Security Rules xếp tầng, với các quy tắc ở các đường dẫn mẹ nông hơn ghi đè các quy tắc ở các nút con sâu hơn. Khi bạn viết một quy tắc ở một nút con, hãy nhớ rằng quy tắc đó chỉ có thể cấp thêm đặc quyền. Bạn không thể tinh chỉnh hoặc thu hồi quyền truy cập vào dữ liệu ở một đường dẫn sâu hơn trong cơ sở dữ liệu.
Không nên dùng: Tinh chỉnh các quy tắc ở các đường dẫn con
{
"rules": {
"foo": {
// allows read to /foo/*
".read": "data.child('baz').val() === true",
"bar": {
/* ignored, since read was allowed already */
".read": false
}
}
}
} |
| Giải pháp: Viết các quy tắc ở các đường dẫn mẹ có phạm vi rộng và cấp các đặc quyền cụ thể hơn ở các đường dẫn con Nếu nhu cầu truy cập dữ liệu của bạn yêu cầu độ chi tiết cao hơn, hãy giữ các quy tắc của bạn ở mức chi tiết. Tìm hiểu thêm về cách xếp tầng Realtime Database Security Rules trong Cú pháp cốt lõi của Realtime Database Security Rules. |
Quyền truy cập bị đóng
Trong khi bạn đang phát triển ứng dụng, một phương pháp phổ biến khác là giữ cho dữ liệu của bạn bị khoá. Thông thường, điều này có nghĩa là bạn đã đóng quyền truy cập đọc và ghi đối với tất cả người dùng, như sau:
Cloud Firestore
// Deny read/write access to all users under any conditions service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
Realtime Database
{
"rules": {
".read": false,
".write": false
}
}
Cloud Storage
// Access to files through Cloud Storage is completely disallowed. // Files may still be accessible through App Engine or Google Cloud Storage APIs. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if false; } } }
Firebase Admin SDK và Cloud Functions vẫn có thể truy cập vào cơ sở dữ liệu của bạn. Sử dụng các quy tắc này khi bạn dự định sử dụng Cloud Firestore hoặc Realtime Database làm phần phụ trợ chỉ dành cho máy chủ kết hợp với Firebase Admin SDK. Mặc dù an toàn, nhưng bạn nên kiểm thử để đảm bảo rằng các ứng dụng của ứng dụng 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 các quy tắc này hoạt động trong Bắt đầu sử dụng Cloud Firestore Security Rules.
Kiểm thử Cloud Firestore Security Rules
Để 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 Firebase. Sử dụng Cloud Firestore trình mô phỏng để chạy và tự động hoá các quy trình kiểm thử đơn vị trong môi trường cục bộ trước khi bạn triển khai bất kỳ thay đổi nào.
Để nhanh chóng xác thực Firebase Security Rules trong Bảng điều khiển Firebase, hãy sử dụng Trình mô phỏng quy tắc Firebase.