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

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

Nếu bạn nhận được cảnh báo rằng cơ sở dữ liệu của bạn trên Cloud Firestore không được bảo mật đúng cách, bạn có thể giải quyết các lỗ hổng này bằng cách sửa đổi và kiểm tra Các quy tắc bảo mật của Cloud Firestore.

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

Tìm hiểu các quy tắc bảo mật của Cloud Firestore

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. Mặc định các quy tắc cho mọi phiên bản Cloud Firestore được tạo trong bảng điều khiển của Firebase 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 sẽ cần phải sửa đổi các quy tắc đó và có thể xem xét cấp quyền truy cập hàng loạt 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 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ác quy tắc và bảo mật dữ liệu của bạn.

Khi bạn phát triển ứng dụng và thử nghiệm các cấu hình khác nhau cho 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 với quy tắc không an toàn

Các quy tắc bảo mật của Cloud Firestore mà có thể bạn đã thiết lập theo mặc định hoặc như ban đầu đã nỗ lực phát triển ứng dụng bằng Cloud Firestore cần được xem xét và cập nhật trước khi triển khai ứng dụng. Đảm bảo bạn bảo mật đúng cách dữ liệu bằng cách tránh các lỗi phổ biến sau.

Truy cập mở

Khi thiết lập Cloud Firestore, bạn có thể đã thiết lập 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 nhưng nếu bạn đã triển khai 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, rồi bất cứ ai đoán mã dự án của bạn có thể đánh cắp, sửa đổi hoặc xoá dữ liệu.

Không nên: Quyền đọc và ghi đối với tất cả các tính năng 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ế việc đọc và quyền 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 đối với sự thiếu an toàn này là phương thức bảo mật dựa trên người dùng nhờ tính năng Xác thực Firebase. Tìm hiểu thêm về cách xác thực người dùng bằng các 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 read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Quyền truy cập riêng tư và công khai kết hợp

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 của mọi người dùng đã xác thực

Đôi khi, Quy tắc bảo mật của Cloud Firestore kiểm tra để đảm bảo rằng người dùng đã đăng nhập nhưng không hạn chế 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 .

Không nên: Mọi người dùng đã đăng nhập đều đã đọc và quyền ghi vào toàn bộ cơ sở dữ liệu.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Giải pháp: Dùng biện pháp bảo mật để thu hẹp quyền truy cập conditions.

Khi kiểm tra tính xác thực, bạn cũng có thể sử dụng của các thuộc tính xác thực để hạn chế hơn nữa quyền truy cập đối với những người dùng cụ thể cho các tập dữ liệu cụ thể. Tìm hiểu thêm về thêm điều kiện bảo mậtquyề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 riêng tư và công khai kết hợp

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 đóng

Trong khi phát triển ứng dụng, một phương pháp phổ biến khác là giữ lại đã khoá dữ liệu. Thông thường, trường hợp này có nghĩa là bạn đã tắt tính năng đọc và ghi quyền truy cập của tất cả người dùng, cụ thể 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ị của Firebase và Cloud Functions vẫn có thể truy cập vào cơ sở dữ liệu. Hãy áp dụng các quy tắc này khi bạn có ý định sử dụng Cloud Firestore dưới dạng chế độ chỉ dành cho máy chủ phụ trợ kết hợp với Firebase SDK dành cho quản trị viên. Mặc dù việc này an toàn nhưng bạn nên kiểm tra để đảm bảo rằng ứng dụng khách của ứng dụng có thể truy xuất dữ liệu đúng cách.

Tìm hiểu thêm về Quy tắc bảo mật của Cloud Firestore và cách hoạt động của các quy tắc này Bắt đầu sử dụng các quy tắc bảo mật của Cloud Firestore.

Kiểm tra Quy tắc bảo mật của Cloud Firestore

Để 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 của Cloud Firestore, hãy dùng trình mô phỏng Cloud Firestore. Sử dụng Cloud Firestore trình mô phỏng để chạy và tự động hoá việc 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 kiểm thử các Quy tắc bảo mật đã cập nhật của Cloud Firestore trong bảng điều khiển của Firebase, hãy sử dụng công cụ Rules Playground.

  1. Để mở Rules Playground, hãy nhấp vào Khu vực chơi quy tắc trong thẻ Quy tắc.
  2. Trong phần cài đặt Rules Playground (Quy tắc), hãy chọn các lựa chọn cho quy trình kiểm thử của bạn, 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 được xác thực, hoặc mã nhận dạng người dùng cụ thể
    • Dữ liệu cụ thể theo tài liệu mà các quy tắc của bạn tham chiếu cụ thể (cho ví dụ: nếu các quy tắc của bạn yêu cầu phải có một trường cụ thể trước cho phép ghi)
  3. Nhấp vào Chạy rồi tìm kết quả trong biểu ngữ phía trên cửa sổ quy tắc.