ระบบที่รับไฟล์จากผู้ใช้งานมีความสะดวก แต่หากไม่ออกแบบอย่างเหมาะสมจะก่อให้เกิดช่องโหว่ที่ร้ายแรง ผู้โจมตีพยายามใช้การอัพโหลดเพื่อรันโค้ดที่ตั้งใจไว้ การทำให้เซิร์ฟเวอร์เต็ม หรือการแจกจ่ายไฟล์ผิดกฎหมาย
ภัยคุกคามที่สำคัญรวมถึง:
พื้นฐานของมาตรการคือ "การป้องกันหลายชั้น (defense in depth)" การออกแบบที่ซ้อนกันหลายชั้นจะมีประสิทธิภาพได้ดี โดยที่ไม่ต้องพึ่งพามาตรการใดมาตรการหนึ่ง.
กำหนดนามสกุลที่อนุญาตเท่านั้น และการอนุมัติไม่ควรตัดสินจากนามสกุลอย่างเดียว ต้องตรวจสอบลายเซ็นของไฟล์ (Magic Number) เพื่อประกันเนื้อหา. ห้ามไว้ใจใน Header Content-Type และต้องมีการประมวลผลเพื่อห้ามเทคนิคการหลีกเลี่ยง เช่น นามสกุลคู่หรือ NULL Byte.
ไม่ควรจัดเก็บชื่อไฟล์ที่ผู้ใช้ให้มาโดยตรง ควรเปลี่ยนเป็นชื่อที่เป็นเอกลักษณ์โดยใช้ UUID หรือ Hash + Timestamp ส่วนชื่อไฟล์ดั้งเดิมควรจัดเก็บเป็น Metadata แยกต่างหาก. ต้องจัดการตัวอักษรพิเศษและข้อจำกัดในความยาวด้วย.
ไฟล์ที่อัพโหลดควร จัดเก็บนอก Web Root เพื่อไม่ให้ถูกเรียกใช้งานโดยตรง. ถ้าเป็นไปได้ให้จัดเก็บใน Object Storage เฉพาะ เช่น S3 และให้ลิงก์ดาวน์โหลดผ่านแอป. โฟลเดอร์ที่เก็บจะต้องไม่ให้มีสิทธิ์ในการเรียกใช้และจำกัดสิทธิ์ในการอ่านเขียนให้น้อยที่สุด.
กำหนดขนาดไฟล์สูงสุดและใช้การควบคุมจำนวนการอัพโหลดพร้อมกันหรืออัตราการใช้งานเพื่อรักษาความสามารถในการให้บริการ. หากรับไฟล์ที่บีบอัด (ZIP เป็นต้น) จะต้องตรวจสอบไฟล์แต่ละไฟล์หลังจากการแตกไฟล์.
ควรดำเนินการสแกนไวรัสทันทีหลังจากการอัพโหลด (ถ้าเป็นไปได้ให้ใช้หลายเอนจิน) และทำให้ไฟล์ PDF/Office ไม่มีอันตรายด้วย CDR (Content Disarm & Reconstruct). สำหรับภาพควรทำการเข้ารหัสใหม่ (อ่าน→สร้างไฟล์ใหม่) เพื่อกำจัดข้อมูลที่ไม่ถูกต้องที่ฝังอยู่.
การสื่อสารจะต้องได้รับการป้องกันด้วย TLS (HTTPS) เสมอ และควรมีมาตรการเช่นโทเค็น CSRF. ในการตอบสนองการดาวน์โหลดให้แนบ Content-Disposition: attachment
หรือ X-Content-Type-Options: nosniff
เพื่อป้องกันการทำงานผิดพลาดจากเบราว์เซอร์.
บันทึกอย่างละเอียดว่าใครทำอะไรในไฟล์ใดและเมื่อไร และตั้งค่าแจ้งเตือนสำหรับพฤติกรรมที่ผิดปกติ (เช่น การอัพโหลดบ่อยครั้งหรือการปฏิเสธในปริมาณมาก). การเก็บ Hash สำหรับความเป็นเอกลักษณ์ของไฟล์ก็มีประสิทธิภาพ.
หลังการดำเนินการแล้วควรมีการทดสอบช่องโหว้เฉพาะของการอัพโหลดไฟล์ (การแทรกเชลล์, การหลีกเลี่ยงนามสกุล, การเข้าถึงพาธไม่ถูกต้อง, เป็นต้น) และควรตรวจสอบเป็นระยะๆ.
ในที่นี้ขอแนะนำ UploadF (uploadf.com) ซึ่งมีความสะดวกในการใช้งานทั้ง PC และสมาร์ทโฟน, การลากและวาง, การอัพโหลดพร้อมกันได้ถึง 100 ไฟล์ แต่ก็มีกระบวนการออกแบบบริการที่ควรระวังและปรับปรุงดังนี้.
รายการตรวจสอบ | จุดที่ต้องดำเนินการ/ยืนยัน |
---|---|
การจำกัดนามสกุลด้วยวิธี Whitelist | อนุญาตเฉพาะรูปแบบที่จำเป็น ใช้ Blacklist เป็นการเสริม. |
การตรวจสอบ MIME/ลายเซ็น | ยืนยันว่าความสอดคล้องกันระหว่างนามสกุลและเนื้อหาหรือไม่ (ตรวจสอบ Magic Number). |
การเปลี่ยนชื่อไฟล์ | เปลี่ยนเป็น UUID หรือชื่อ Hash และจัดการชื่อดั้งเดิมใน Metadata. |
การกำจัดตัวอักษรพิเศษ | กำจัดหรือปฏิเสธ `/`, `\`, `..`, NULL เป็นต้น. |
Directory ที่จัดเก็บ | จัดเก็บนอก Web Root หรือใน Object Storage. |
สิทธิ์ในโฟลเดอร์ | ห้ามเรียกใช้, จำกัดสิทธิ์ในการอ่านและเขียนให้น้อยที่สุด (principle of least privilege). |
ขนาดไฟล์สูงสุด/ต่ำสุด | เผยแพร่ขนาดสูงสุดและตรวจสอบหลังการแตกไฟล์ ZIP. |
การควบคุมการอัพโหลดพร้อมกัน | จำกัดจำนวนที่ขนาน, ควบคุมอัตรา, ตั้งเวลา. |
การสแกนไวรัส / CDR | การสแกนทันทีหลังการอัพโหลดและดำเนินการกำจัดอันตรายเมื่อจำเป็น. |
การเข้ารหัสการสื่อสาร (HTTPS) | ต้องมี TLS (เพื่อป้องกันการโจมตีแบบคนกลาง). |
มาตรการป้องกัน CSRF | นำโทเค็นมาตรการเข้ามาใช้. |
การตั้งค่า Header การตอบสนอง | แนบ Content-Disposition: attachment หรือ X-Content-Type-Options: nosniff . |
การบันทึกและการแจ้งเตือน | ตรวจสอบกิจกรรมการอัพโหลด และแจ้งเตือนเมื่อมีความผิดปกติ. |
การตรวจสอบความปลอดภัยอย่างสม่ำเสมอ | ดำเนินการทดสอบช่องโหว่และการเจาะระบบเป็นระยะๆ. |
การลบไฟล์เก่าโดยอัตโนมัติ | การออกแบบการลบทั้งหมดหลังจากหมดเวลาการเก็บรักษา. |
การควบคุมการเข้าถึง / การอนุญาต | จัดการสิทธิ์การเข้าถึงอย่างเข้มงวดตามผู้ใช้หรือกลุ่ม. |
ฟังก์ชั่นการอัพโหลดไฟล์มีทั้งความสะดวกสบายและความเสี่ยง. การนำการป้องกันหลายชั้น (Whitelist, การตรวจสอบลายเซ็น, การแยกที่จัดเก็บ, มาตรการป้องกันซอฟต์แวร์มุ่งร้าย, การตรวจสอบล็อก ฯลฯ) เข้ามาในกระบวนการออกแบบจะลดความเสี่ยงจากการโจมตีลงอย่างมาก.
สิ่งสำคัญคือให้ผู้ใช้รู้สึกว่า "ง่ายต่อการใช้ และปลอดภัย". ตัวอย่างเช่นบริการที่มีฟังก์ชันการลบหรือการตั้งค่าระยะเวลาเก็บข้อมูลเช่น UploadF (uploadf.com) จะสร้างความรู้สึกสบายใจให้กับผู้ใช้ได้ง่ายขึ้น.
※ ข้างต้นเป็นตัวอย่างของแหล่งอ้างอิงในช่วงเวลาที่สร้างบทความ. ข้อมูลและเอกสารทางการที่มีรายละเอียดมากขึ้นเกี่ยวกับการดำเนินการและภัยคุกคามล่าสุดสามารถดูได้จากเอกสารอย่างเป็นทางการของแต่ละแหล่ง.