Sửa các quy tắc không an toàn

Sử dụng hướng dẫn này để hiểu các lỗ hổng phổ biến trong cấu hình Quy tắc bảo mật của Cloud Firestore, xem xét và bảo mật tốt hơn các quy tắc của riêng bạn cũng như kiểm tra các thay đổi của bạn trước khi triển khai chúng.

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 tra Quy tắc bảo mật Cloud Firestore của mình.

Để xem Quy tắc bảo mật hiện có của bạn, hãy chuyển đến tab Quy tắc trong bảng điều khiển Firebase.

Hiểu các quy tắc bảo mật trên Cloud Firestore của bạn

Quy tắc bảo mật của Cloud Firestore bảo vệ dữ liệu của bạn khỏi những người dùng độc hại. Các quy tắc mặc định cho mọi phiên bản Cloud Firestore được tạo trong bảng điều khiển Firebase đều từ chối quyền truy cập của tất cả người dùng. Để phát triển ứng dụng và truy cập cơ sở dữ liệu của bạn, bạn sẽ cần sửa đổi các quy tắc đó và có thể xem xét 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 vào môi trường sản xuất, hãy dành thời gian để định cấu hình đúng 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à thử nghiệm các cấu hình khác nhau cho quy tắc của mình, hãy sử dụng trình mô phỏng Cloud Firestore để chạy ứng dụng của bạn trong môi trường phát triển cục bộ.

Các tình huống phổ biến với các quy tắc không an toàn

Quy tắc bảo mật của Cloud Firestore 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 của mình với Cloud Firestore ban đầu phải được xem xét và cập nhật trước khi bạn triển khai ứng dụng của mình. 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 cạm bẫy phổ biến sau đây.

Mở quyền truy cập

Khi thiết lập Cloud Firestore, bạn có thể đã đặt các quy tắc của mình để cho phép 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ó sẵn 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 ID dự án của bạn đều có thể lấy cắp, sửa đổi hoặc xóa dữ liệu.

Không khuyến khích: 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 truy cập đọc và ghi.

Xây dựng các quy tắc có ý nghĩa đối 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 tình trạng thiếu bảo mật này là bảo mật dựa trên người dùng với Xác thực Firebase. Tìm hiểu thêm về xác thực người dùng bằng quy tắc .

Chỉ 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 read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Truy cập hỗn hợp công cộng 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 != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Quyền truy cập cho bất kỳ người dùng được xác thực nào

Đôi khi, Quy tắc bảo mật của Cloud Firestore kiểm tra xem người dùng đã đăng nhập chưa, nhưng không hạn chế thêm quyền truy cập dựa trên 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 đã đăng nhập nào cũng có quyền truy cập vào dữ liệu.

Không được khuyến nghị: Bất kỳ người dùng đăng nhập nào cũng có quyền truy cập đọ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: Thu hẹp quyền truy cập bằng các điều kiện bảo mật.

Khi kiểm tra xác thực, bạn cũng có thể muốn sử dụng một trong các thuộc tính xác thực để hạn chế hơn nữa quyền truy cập vào những người dùng cụ thể đối với các 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ậtquyền truy cập dựa trên vai trò .

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.
    }
  }
}

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;
    }
  }
}
  

Truy cập hỗn hợp công cộng 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
    }
  }
}
  

Quyền truy cập đã đóng

Trong khi bạn đang phát triển ứng dụng của mình, một cách tiếp cận phổ biến khác là khóa dữ liệu của bạn. 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:

// 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à Chức năng đám mây vẫn có thể truy cập cơ sở dữ liệu của bạn. Sử dụng các quy tắc này khi bạn có ý định sử dụng Cloud Firestore làm chương trình phụ trợ chỉ dành cho máy chủ kết hợp với SDK quản trị Firebase. Mặc dù nó an toàn nhưng bạn nên kiểm tra xem ứng dụng khách của ứng dụng có thể truy xuất dữ liệu đúng cách hay không.

Tìm hiểu thêm về Quy tắc bảo mật của Cloud Firestore và cách chúng hoạt động trong Bắt đầu với Quy tắc bảo mật của Cloud Firestore .

Kiểm tra quy tắc bảo mật Cloud Firestore của bạn

Để kiểm tra hành vi của ứng dụng và xác minh cấu hình Quy tắc bảo mật Cloud Firestore của bạn, 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 hóa các bài kiểm tra đơ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 kiểm tra Quy tắc bảo mật Cloud Firestore được cập nhật của bạn trong bảng điều khiển Firebase, hãy sử dụng công cụ Rules Playground.

  1. Để mở Sân chơi quy tắc, hãy nhấp vào Sân chơi quy tắc từ tab Quy tắc .
  2. Trong cài đặt Sân chơi quy tắc , hãy chọn các tùy chọn cho bài kiểm tra của bạn, bao gồm:
    • Kiểm tra đọc hoặc ghi
    • Một vị trí cụ thể trong cơ sở dữ liệu của bạn, dưới dạng đường dẫn
    • Loại xác thực - người dùng ẩn danh chưa được xác thực, được xác thực hoặc ID 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 sự hiện diện của một trường cụ thể trước khi cho phép ghi)
  3. Nhấp vào Chạy và tìm kết quả trong biểu ngữ phía trên cửa sổ quy tắc.