Tìm hiểu cách bảo mật tệp

Cloud Storage for Firebase cung cấp mô hình bảo mật dựa trên đường dẫn khai báo có tên là Firebase Security Rules cho Cloud Storage. Công cụ này cho phép bạn nhanh chóng và dễ dàng bảo mật tệp của bạn.

Hiểu rõ các quy tắc

Firebase Security Rules cho Cloud Storage dùng để xác định người đã đọc và ghi quyền truy cập vào các tệp được lưu trữ trong Cloud Storage, cũng như cách các tệp được lưu trữ có cấu trúc và siêu dữ liệu nào trong đó. Loại quy tắc cơ bản là allow quy tắc cho phép các yêu cầu readwrite nếu một quy tắc tuỳ ý chỉ định được chỉ định, ví dụ:

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

Đường dẫn trùng khớp

Cloud Storage Security Rules match đường dẫn tệp dùng để truy cập vào các tệp trong Cloud Storage. Quy tắc có thể match đường dẫn chính xác hoặc đường dẫn ký tự đại diện, và có thể lồng ghép các quy tắc. Nếu không có quy tắc so khớp nào cho phép phương thức yêu cầu hoặc điều kiện được đánh giá là false, yêu cầu bị từ chối.

Kết quả khớp chính xác

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

Kết quả trùng khớp được lồng

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Kết quả khớp với ký tự đại diện

Bạn cũng có thể sử dụng quy tắc để match một mẫu bằng ký tự đại diện. Ký tự đại diện là một biến được đặt tên đại diện cho một chuỗi đơn lẻ, chẳng hạn như profilePhoto.png hoặc nhiều phân đoạn đường dẫn, chẳng hạn như images/profilePhoto.png

Bạn có thể tạo một ký tự đại diện bằng cách thêm dấu ngoặc nhọn xung quanh tên ký tự đại diện, chẳng hạn như {string}. Bạn có thể khai báo ký tự đại diện nhiều phân đoạn bằng cách thêm =** vào phương thức tên ký tự đại diện, chẳng hạn như {path=**}:

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Nếu nhiều quy tắc khớp với một tệp, kết quả sẽ là OR trong kết quả của tất cả đánh giá quy tắc. Nghĩa là, nếu bất kỳ quy tắc nào mà tệp phù hợp có kết quả là true, kết quả là true

Trong các quy tắc trên, tệp "images/profilePhotos.png" có thể đọc được nếu condition hoặc other_condition cho kết quả là true, trong khi tệp "images/users/user:12345/profilePhotos.png" chỉ phải tuân theo kết quả của other_condition

Biến ký tự đại diện có thể được tham chiếu từ trong tệp cung cấp match uỷ quyền tên hoặc đường dẫn:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Cloud Storage Security Rules không phân tầng và các quy tắc chỉ được đánh giá khi đường dẫn yêu cầu khớp với một đường dẫn có quy tắc được chỉ định.

Đánh giá yêu cầu

Các lượt tải lên, tải xuống, thay đổi siêu dữ liệu và xoá được đánh giá bằng cách sử dụng Đã gửi request tới Cloud Storage. Biến request chứa đường dẫn tệp nơi yêu cầu đang được thực hiện, thời điểm yêu cầu được thực hiện đã nhận và giá trị resource mới nếu yêu cầu là một lượt ghi. Tiêu đề HTTP và trạng thái xác thực.

Đối tượng request cũng chứa mã nhận dạng duy nhất của người dùng và tải trọng Firebase Authentication trong đối tượng request.auth. Đối tượng này sẽ là được giải thích kỹ hơn trong phần Bảo mật dựa trên người dùng của phần Tài liệu.

Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng request:

Tài sản Loại Mô tả
auth ánh xạ<chuỗi, chuỗi> Khi người dùng đăng nhập, hãy cung cấp uid, mã nhận dạng duy nhất của người dùng và token, bản đồ của Firebase Authentication xác nhận quyền sở hữu JWT. Nếu không, null.
params ánh xạ<chuỗi, chuỗi> Bản đồ chứa các tham số truy vấn của yêu cầu.
path đường dẫn path đại diện cho đường dẫn mà yêu cầu đang được thực hiện tại.
resource ánh xạ<chuỗi, chuỗi> Giá trị tài nguyên mới chỉ hiển thị trên các yêu cầu write.
time dấu thời gian Dấu thời gian cho biết thời gian máy chủ đánh giá yêu cầu.

Đánh giá tài nguyên

Khi đánh giá quy tắc, bạn cũng nên đánh giá siêu dữ liệu của tệp đang được tải lên, tải xuống, sửa đổi hoặc xoá. Điều này cho phép bạn tạo các quy tắc phức tạp và mạnh mẽ để thực hiện những việc như chỉ cho phép các tệp có loại nội dung được tải lên hoặc chỉ các tệp lớn hơn kích thước nhất định đã bị xoá.

Firebase Security Rules cho Cloud Storage cung cấp siêu dữ liệu tệp trong resource chứa các cặp khoá/giá trị của siêu dữ liệu được hiển thị trong một Đối tượng Cloud Storage. Bạn có thể kiểm tra các thuộc tính này trên read hoặc write yêu cầu để đảm bảo tính toàn vẹn của dữ liệu.

Trên các yêu cầu write (chẳng hạn như tải lên, cập nhật siêu dữ liệu và xoá), trong bổ sung vào đối tượng resource chứa siêu dữ liệu tệp cho tệp đó hiện tồn tại trên đường dẫn yêu cầu, bạn cũng có thể sử dụng Đối tượng request.resource chứa một tập hợp con siêu dữ liệu tệp cần được nếu được phép ghi. Bạn có thể sử dụng hai giá trị này để đảm bảo dữ liệu tính toàn vẹn hoặc thực thi các quy tắc ràng buộc của ứng dụng như loại tệp hay kích thước tệp.

Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng resource:

Tài sản Loại Mô tả
name chuỗi Tên đầy đủ của đối tượng
bucket chuỗi Tên của bộ chứa chứa đối tượng này.
generation int GCS tạo đối tượng của đối tượng này.
metageneration int GCS siêu dữ liệu đối tượng của đối tượng này.
size int Kích thước của đối tượng tính bằng byte.
timeCreated dấu thời gian Dấu thời gian thể hiện thời điểm một đối tượng được tạo.
updated dấu thời gian Dấu thời gian thể hiện thời điểm cập nhật gần đây nhất của một đối tượng.
md5Hash chuỗi Hàm băm MD5 của đối tượng.
crc32c chuỗi Hàm băm crc32c của đối tượng.
etag chuỗi Etag liên kết với đối tượng này.
contentDisposition chuỗi Bố cục nội dung liên kết với đối tượng này.
contentEncoding chuỗi Phương thức mã hoá nội dung liên kết với đối tượng này.
contentLanguage chuỗi Ngôn ngữ của nội dung liên kết với đối tượng này.
contentType chuỗi Loại nội dung liên kết với đối tượng này.
metadata ánh xạ<chuỗi, chuỗi> Cặp khoá/giá trị của siêu dữ liệu tuỳ chỉnh bổ sung do nhà phát triển chỉ định.

request.resource chứa tất cả các mã này, ngoại trừ generation, metageneration, etag, timeCreatedupdated.

Ví dụ đầy đủ

Kết hợp tất cả lại với nhau, bạn có thể tạo một ví dụ đầy đủ về các quy tắc cho hình ảnh giải pháp lưu trữ:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type (if it exists)
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     }
   }
 }
}

Bây giờ, hãy tích hợp Firebase Authentication để yêu cầu cấp quyền truy cập chi tiết vào tệp cho mỗi người dùng trong phần Bảo mật người dùng.