Tránh các quy tắc không an toàn

Hãy 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 Firebase Security Rules 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 dữ liệu của mình không được bảo mật đúng cách, hãy xem lại những lỗi thường gặp này và cập nhật mọi quy tắc dễ bị xâm phạm.

Truy cập vào Firebase Security Rules của bạn

Để xem Rules hiện có, hãy sử dụng CLI Firebase hoặc Bảng điều khiển Firebase. Đảm bảo rằng bạn chỉnh sửa các quy tắc sử dụng cùng một phương pháp, một cách nhất quán để tránh ghi đè nhầm nội dung cập nhật. Nếu bạn không chắc chắn cho dù các quy tắc được xác định cục bộ có phản ánh những cập nhật gần đây nhất, Firebase bảng điều khiển luôn cho thấy phiên bản Firebase Security Rules được triển khai gần đây nhất.

Để truy cập vào các quy tắc trong bảng điều khiển của Firebase, hãy chọn dự án, sau đó chuyển đến Realtime Database, Cloud Firestore hoặc Bộ nhớ. Nhấp vào Quy tắc sau khi bạn truy cập vào đúng cơ sở dữ liệu hoặc bộ nhớ bộ chứa.

Để truy cập vào các quy tắc của bạn từ CLI Firebase, hãy chuyển đến tệp quy tắc đã ghi chú trong tệp firebase.json của bạn.

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 bạn tạo cơ sở dữ liệu hoặc bộ chứa Cloud Storage trong bảng điều khiển Firebase, bạn có thể chọn từ chối cấp quyền truy cập cho tất cả người dùng (Chế độ khoá) hoặc cấp quyền truy cập vào tất cả người dùng (Chế độ thử nghiệm). Mặc dù bạn có thể muốn có một cấu hình mở hơn trong khoảng thời gian hãy đảm bảo bạn dành thời gian để định cấu hình đúng các quy tắc và bảo mật dữ liệu trước khi triển khai ứng dụng.

Khi bạn phát triển ứng dụng và thử nghiệm các cấu hình khác nhau cho hãy sử dụng một trong các trình mô phỏng Firebase cục bộ để chạy ứng dụng của bạn 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

Bạn nên xem xét và cập nhật 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 sai lầm thường gặp sau đây.

Truy cập mở

Khi thiết lập dự án Firebase, bạn có thể đặt các quy tắc thành cho phé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 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 via 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ế 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 vấn đề bảo mật này, đó là khả năng bảo mật dựa trên người dùng với 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 Firestore

Realtime Database

Cloud Storage

Quyền truy cập của mọi người dùng đã xác thực

Đôi khi, Rules kiểm tra để đảm bảo rằng người dùng đã đăng nhập nhưng không làm gì khác 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 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: 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.

Cloud Firestore

service 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;
    }
  }
}
Giải pháp: Hạn chế quyền truy cập bằng các điều kiện bảo mật.

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ề các thuộc tính xác thực.

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) Các quy tắc được kế thừa không đúng cách

tầng Realtime Database Security Rules, với các quy tắc ở mức nông hơn, đường dẫn mẹ sẽ ghi đè quy tắc sâu hơn, nút con. Khi bạn viết quy tắc tại nút con, hãy nhớ rằng ứng dụng chỉ có thể cấp thêm đặc quyền. Bạn không thể tinh chỉnh hoặc thu hồi 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: Tinh chỉnh quy tắc tại đườ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 quy tắc tại đường dẫn gốc có phạm vi rộng và cấp đặc quyền cụ thể hơn tại các đường dẫn con Nếu bạn cần chi tiết hơn cho việc truy cập dữ liệu, hãy duy trì các quy tắc thật chi tiết. Tìm hiểu thêm về cách xếp tầng Realtime Database Security Rules trong Chính của Realtime Database Security Rules.

Đườ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:

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

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 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 SDK quản trị Firebase. 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ề Cloud Firestore Security Rules và cách chúng 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 của bạn, 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á 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.

Để xác thực nhanh Firebase Security Rules trong bảng điều khiển Firebase, hãy sử dụng Trình mô phỏng quy tắc của Firebase.