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

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 phiên bản Cloud Firestore được tạo trong bảng điều khiển Firebase sẽ từ chối quyền truy cập đối với 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 vào 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 công khai

Khi thiết lập Cloud Firestore, có thể bạn đã đặt các quy tắc cho phép 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 bạn, 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 đối với 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ệ 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 đề 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ề xác thực người dùng bằng các 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 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 giữa 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 được xác thực

Đôi khi, Cloud Firestore 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 có chứa 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: Thu hẹp quyền truy cập bằng các điều kiện bảo mật.

Khi kiểm tra quá trình 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 đố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ề cách thêm các đ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 kết hợp giữa 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
    }
  }
}
  

Quyền truy cập đối với địa chỉ email chưa xác minh

Đôi khi, Cloud Firestore Security Rules kiểm tra để đảm bảo rằng email của người dùng thuộc một miền cụ thể. Mặc dù đây thường là một phương pháp hay, nhưng email không phải lúc nào cũng được xác minh trong quá trình đăng nhập cho đến khi người dùng thực hiện một bước bổ sung sau khi nhận được email xác minh. Đảm bảo rằng bạn đang xác thực để email đó thực sự thuộc về người dùng.

Không nên dùng: Bất kỳ người dùng nào cũng có thể đăng nhập bằng một địa chỉ email bất kỳ.
service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email.endsWith('@example.com')
    }
  }
}
Giải pháp: Chỉ cho phép truy cập vào email đã xác minh.

Xác minh email

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email_verified
                 && request.auth.email.endsWith('@example.com')
    }
  }
}

Quyền truy cập có giới hạn

Trong khi 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 được khoá. Thông thường, điều này có nghĩa là bạn đã đóng quyền đọ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;
    }
  }
}

Firebase Admin SDK 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ụ trợ chỉ dành cho máy chủ cùng 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 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ề Cloud Firestore Security Rules và cách hoạt động của các chỉ số này trong bài viết Bắt đầu sử dụng 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 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á các bài kiểm thử đơn vị trong môi trường cục bộ trước khi bạn triển khai mọi thay đổi.

Để nhanh chóng kiểm thử Cloud Firestore Security Rules đã cập nhật trong bảng điều khiển của Firebase, hãy sử dụng công cụ Sân chơi quy tắc.

  1. Để mở Rules Playground, hãy nhấp vào Rules Playground trong thẻ Quy tắc.
  2. Trong phần cài đặt Sân chơi quy tắc, hãy chọn các lựa chọn cho thử nghiệm 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 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à các quy tắc của bạn tham chiếu cụ thể (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 khi cho phép ghi)
  3. Nhấp vào Chạy và xem kết quả trong biểu ngữ phía trên cửa sổ quy tắc.