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 bảo mật 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.

Để được trợ giúp AI, hãy sao chép câu lệnh bên dưới vào tác nhân lập trình AI (như Gemini trong Android Studio, Antigravity, Claude Code, Codex và Cursor). Bạn có thể tuỳ chỉnh câu lệnh và lặp lại với tác nhân. Truy cập vào bài viết Kỹ năng của tác nhân Firebase để biết thông tin chi tiết về cách cài đặt.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's Firestore data.

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ảo mật 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 của 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 của 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 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 thực tế, 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 phát triển ứng dụng và thử nghiệm 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 thường gặp khi 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 mới 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 rằng 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 phổ biến sau đây.

Truy cập mở

Khi thiết lập Cloud Firestore, bạn có thể đã đặt quy tắc cho phép truy cập công khai 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 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ỉ 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 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 thông tin 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 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 đọ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ách sử dụ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 có thể 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 của người dùng cụ thể vào 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ậ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
    }
  }
}
  

Quyền truy cập cho địa chỉ email chưa được xác minh

Đôi khi, Cloud Firestore Security Rules sẽ kiểm tra xem email của người dùng có thuộc một miền cụ thể hay không. 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 thêm một bước khi nhận được email xác minh. Hãy đảm bảo rằng bạn đang xác thực rằng 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 tuỳ ý.
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: Thu hẹp quyền truy cập chỉ cho những 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 bị đóng

Trong khi phát triển ứng 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 đã đó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;
    }
  }
}

SDK của Firebase dành cho quản trị viên 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 định dùng Cloud Firestore làm phần phụ trợ chỉ dành cho máy chủ kết hợp với SDK của Firebase dành cho quản trị viên. Mặc dù an toàn, nhưng bạn nên kiểm tra để đảm bảo ứ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 thành phần 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 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á cá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ử 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ụ Rules Playground (Sân chơi quy tắc).

  1. Để mở Sân chơi quy tắc, hãy nhấp vào Sân chơi quy tắc trong thẻ Quy tắc.
  2. Trong phần cài đặt Môi trường thử nghiệm 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 đườ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à tìm kết quả trong biểu ngữ phía trên cửa sổ quy tắc.