Cloud Storage for Firebase มีโมเดลความปลอดภัยตามเส้นทางแบบประกาศ ที่เรียกว่า Firebase Security Rules สำหรับ Cloud Storage ซึ่งทำให้คุณสามารถ ดำเนินการต่อไปนี้ได้อย่างรวดเร็วและง่ายดาย ทำให้ไฟล์ปลอดภัย
ทำความเข้าใจกฎ
Firebase Security Rules สําหรับ Cloud Storage ใช้เพื่อระบุว่าใครอ่านและเขียนแล้ว
สิทธิ์เข้าถึงไฟล์ที่จัดเก็บไว้ใน Cloud Storage รวมถึงวิธีการของไฟล์
มีโครงสร้างและข้อมูลเมตาภายใน ประเภทกฎพื้นฐานคือ allow
ซึ่งอนุญาตคำขอ read
และ write
หากมีการระบุ (ไม่บังคับ)
มีการระบุเงื่อนไข เช่น
// 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>;
เส้นทางที่ตรงกัน
Cloud Storage Security Rules match
เส้นทางของไฟล์ที่ใช้เข้าถึงไฟล์
Cloud Storage กฎสามารถmatch
เส้นทางที่แน่นอนหรือเส้นทางไวลด์การ์ด และ
สามารถซ้อนกันได้ด้วย หากไม่มีกฎที่ตรงกันที่อนุญาตเมธอดคำขอ หรือ
ประเมินได้เป็น false
คำขอถูกปฏิเสธ
เหมือนกันทุกประการ
// 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>; }
การจับคู่ที่ซ้อนกัน
// 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>; } }
การจับคู่ไวลด์การ์ด
นอกจากนี้ยังใช้กฎเพื่อmatch
รูปแบบโดยใช้ไวลด์การ์ดได้ด้วย ไวลด์การ์ดคือ
ตัวแปรที่มีชื่อซึ่งแสดงสตริงเดียว เช่น
profilePhoto.png
หรือกลุ่มเส้นทางหลายกลุ่ม เช่น
images/profilePhoto.png
ไวลด์การ์ดสร้างขึ้นโดยการเพิ่มวงเล็บปีกการอบๆ ชื่อไวลด์การ์ด เช่น
{string}
คุณสามารถประกาศไวลด์การ์ดของกลุ่มหลายกลุ่มได้โดยการเพิ่ม =**
ลงในส่วน
ชื่อไวลด์การ์ด เช่น {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>; } }
หากมีกฎหลายข้อตรงกับไฟล์ ผลลัพธ์จะเป็น OR
ของผลลัพธ์ทั้งหมด
และการประเมินกฎ กล่าวคือ หากกฎใดตรงกับไฟล์ประเมินผลเป็น true
ผลลัพธ์คือ true
ในกฎข้างต้น ไฟล์ "images/profilePhoto.png" สามารถอ่านได้ในกรณีต่อไปนี้
condition
หรือ other_condition
ประเมินผลเป็น "จริง" ขณะที่ไฟล์
"images/users/user:12345/profilePhoto.png" จะขึ้นอยู่กับผลลัพธ์ของ
other_condition
อ้างอิงตัวแปรไวลด์การ์ดได้จากภายในไฟล์ที่ระบุ match
ชื่อหรือเส้นทางการให้สิทธิ์:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules ไม่ต่อเนื่อง และจะมีการประเมินกฎเฉพาะเมื่อ เส้นทางคำขอตรงกับเส้นทางที่มีกฎที่ระบุ
ขอรับการประเมิน
ระบบจะประเมินการอัปโหลด ดาวน์โหลด การเปลี่ยนแปลงข้อมูลเมตา และการลบโดยใช้
ส่งเงินจำนวน request
ไปยัง Cloud Storage แล้ว ตัวแปร request
ประกอบด้วยค่า
เส้นทางไฟล์ที่ดำเนินการตามคำขอ เวลาที่คำขอ
ที่ได้รับ และค่า resource
ใหม่หากคำขอเป็นการเขียน ส่วนหัว HTTP
รวมทั้งสถานะการตรวจสอบสิทธิ์
ออบเจ็กต์ request
ยังมีรหัสที่ไม่ซ้ำกันของผู้ใช้และ
เพย์โหลด Firebase Authentication ในออบเจ็กต์ request.auth
ซึ่งจะ
อธิบายเพิ่มเติมในการรักษาความปลอดภัยตามผู้ใช้
ของเอกสาร
รายการที่พักทั้งหมดในออบเจ็กต์ request
แสดงอยู่ด้านล่าง
พร็อพเพอร์ตี้ | ประเภท | คำอธิบาย |
---|---|---|
auth |
แมป<สตริง, สตริง> | เมื่อผู้ใช้เข้าสู่ระบบ ให้ระบุ uid , รหัสที่ไม่ซ้ำกันของผู้ใช้ และ
token แผนที่แสดงการอ้างสิทธิ์ JWT Firebase Authentication รายการ มิฉะนั้น ระบบจะ
null |
params |
แมป<สตริง, สตริง> | แผนที่ที่มีพารามิเตอร์การค้นหาของคำขอ |
path |
เส้นทาง | path ที่แสดงเส้นทางที่มีการส่งคำขอ
แสดงเมื่อ |
resource |
แมป<สตริง, สตริง> | ค่าทรัพยากรใหม่ แสดงเฉพาะในคำขอ write เท่านั้น
|
time |
การประทับเวลา | การประทับเวลาที่แสดงถึงเวลาของเซิร์ฟเวอร์ที่มีการประเมินคำขอ |
การประเมินทรัพยากร
เมื่อประเมินกฎ คุณควรประเมินข้อมูลเมตาของไฟล์ด้วย ถูกอัปโหลด ดาวน์โหลด แก้ไข หรือลบ ซึ่งทำให้คุณสามารถสร้าง และกฎที่ซับซ้อนและมีประสิทธิภาพซึ่งทำสิ่งต่างๆ เช่น อนุญาตเฉพาะไฟล์ที่มี เนื้อหาที่จะอัปโหลด หรือเฉพาะไฟล์ขนาดใหญ่กว่าขนาดที่กำหนด ลบแล้ว
Firebase Security Rules สำหรับ Cloud Storage จะระบุข้อมูลเมตาของไฟล์ใน resource
ซึ่งมีคู่คีย์/ค่าของข้อมูลเมตาที่แสดงใน
Cloud Storage ออบเจ็กต์ ตรวจสอบพร็อพเพอร์ตี้เหล่านี้ได้ใน read
หรือ
write
คำขอเพื่อตรวจสอบความสมบูรณ์ของข้อมูล
ในคำขอ write
(เช่น การอัปโหลด อัปเดตข้อมูลเมตา และการลบ) ใน
นอกเหนือจากออบเจ็กต์ resource
ซึ่งมีข้อมูลเมตาของไฟล์
ที่มีอยู่ในเส้นทางคำขออยู่แล้ว คุณยังสามารถใช้
request.resource
ซึ่งมีข้อมูลเมตาไฟล์บางส่วนที่จะ
เขียนหากการเขียนได้รับอนุญาต คุณใช้ค่า 2 ค่านี้เพื่อตรวจสอบข้อมูล
ความสมบูรณ์หรือบังคับใช้ข้อจำกัดของแอปพลิเคชัน เช่น ประเภทไฟล์หรือขนาดไฟล์
รายการที่พักทั้งหมดในออบเจ็กต์ resource
แสดงอยู่ด้านล่าง
พร็อพเพอร์ตี้ | ประเภท | คำอธิบาย |
---|---|---|
name |
สตริง | ชื่อเต็มของออบเจ็กต์ |
bucket |
สตริง | ชื่อของที่เก็บข้อมูลที่มีออบเจ็กต์นี้ |
generation |
int | GCS การสร้างออบเจ็กต์ของออบเจ็กต์นี้ |
metageneration |
int | GCS Metageneration ของออบเจ็กต์นี้ |
size |
int | ขนาดของออบเจ็กต์ในหน่วยไบต์ |
timeCreated |
การประทับเวลา | การประทับเวลาที่แสดงถึงเวลาที่สร้างออบเจ็กต์ |
updated |
การประทับเวลา | การประทับเวลาที่แสดงถึงเวลาที่อัปเดตออบเจ็กต์ครั้งล่าสุด |
md5Hash |
สตริง | แฮช MD5 ของออบเจ็กต์ |
crc32c |
สตริง | แฮช crc32c ของออบเจ็กต์ |
etag |
สตริง | eTag ที่เชื่อมโยงกับออบเจ็กต์นี้ |
contentDisposition |
สตริง | การจัดการเนื้อหาที่เชื่อมโยงกับออบเจ็กต์นี้ |
contentEncoding |
สตริง | การเข้ารหัสเนื้อหาที่เชื่อมโยงกับออบเจ็กต์นี้ |
contentLanguage |
สตริง | ภาษาของเนื้อหาที่เชื่อมโยงกับออบเจ็กต์นี้ |
contentType |
สตริง | ประเภทเนื้อหาที่เชื่อมโยงกับออบเจ็กต์นี้ |
metadata |
แมป<สตริง, สตริง> | คู่คีย์/ค่าของข้อมูลเมตาที่กำหนดเองเพิ่มเติมที่นักพัฒนาซอฟต์แวร์ระบุ |
request.resource
มีข้อมูลทั้งหมดนี้ ยกเว้น generation
metageneration
, etag
, timeCreated
และ updated
ตัวอย่างแบบเต็ม
เมื่อนำทั้งหมดมารวมกัน คุณก็จะได้สร้างกฎตัวอย่างที่สมบูรณ์สำหรับรูปภาพหนึ่งๆ โซลูชันพื้นที่เก็บข้อมูล
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 } } } }
ต่อไป เรามาผสานรวม Firebase Authentication สำหรับการเข้าถึงแบบละเอียดต่อผู้ใช้ไฟล์ ในส่วนความปลอดภัยของผู้ใช้