12.4.1 File Storage
Verify that files obtained from untrusted sources are stored outside the web
root, with limited permissions.
ChatGPT : การจัดเก็บไฟล์จากแหล่งที่ไม่น่าเชื่อถือ (Untrusted Sources) เป็นประเด็นสำคัญด้านความปลอดภัยของระบบ โดยเฉพาะเว็บแอปพลิเคชันที่อนุญาตให้ผู้ใช้ อัปโหลดไฟล์ เช่น รูปภาพ เอกสาร หรือไฟล์อื่นๆ ซึ่งหากไม่มีมาตรการรักษาความปลอดภัยที่ดี อาจเปิดช่องให้เกิด การโจมตีทางไซเบอร์ เช่น Remote Code Execution (RCE), File Inclusion Attacks และอื่นๆ
- ทำไมต้องจัดเก็บไฟล์จากแหล่งไม่น่าเชื่อถือนอก Web Root?
Web Root คืออะไร?
Web Root คือไดเรกทอรีที่เว็บเซิร์ฟเวอร์ใช้ให้บริการไฟล์ เช่น /var/www/html/ (สำหรับ Apache บน Linux) หรือ C:\inetpub\wwwroot\ (สำหรับ IIS บน Windows) ซึ่งหากมีไฟล์ที่อัปโหลดไปอยู่ภายในโฟลเดอร์นี้โดยตรง อาจถูกเข้าถึงและรันได้โดยตรงจาก URL
- ความเสี่ยงหากไฟล์ถูกเก็บใน Web Root
1.การโจมตีผ่านการรันไฟล์อันตราย (Remote Code Execution - RCE)
- หากผู้ใช้สามารถอัปโหลดไฟล์ .php หรือ .jsp และระบบไม่มีการตรวจสอบที่ดี อาจทำให้แฮกเกอร์รันโค้ดอันตรายบนเซิร์ฟเวอร์ได้
2.การโจมตีแบบ Local File Inclusion (LFI) หรือ Directory Traversal
- หากเว็บอนุญาตให้โหลดไฟล์โดยใช้พาธที่กำหนดเอง อาจมีช่องโหว่ที่ทำให้ผู้โจมตีเข้าถึงไฟล์ระบบที่สำคัญ เช่น /etc/passwd บน Linux หรือ C:\Windows\System32\ บน Windows
3.การเข้าถึงไฟล์ที่มีข้อมูลสำคัญ
- ผู้โจมตีอาจเข้าถึงไฟล์ที่มีข้อมูลส่วนตัว หรือโค้ดเซิร์ฟเวอร์ที่สำคัญโดยตรงผ่าน URL
- แนวทางปฏิบัติที่ดีในการจัดเก็บไฟล์จากแหล่งไม่น่าเชื่อถือ
✅ 1. จัดเก็บไฟล์นอก Web Root
- ควรเก็บไฟล์ไว้ในไดเรกทอรีที่ไม่สามารถเข้าถึงผ่านเว็บโดยตรง เช่น
- Linux: /var/uploads/ หรือ /home/uploads/
- Windows: C:\secure_uploads\
- จากนั้น ใช้ Backend เป็นตัวจัดการและเสิร์ฟไฟล์ตามสิทธิ์ของผู้ใช้
✅ 2. กำหนดสิทธิ์ไฟล์ (File Permissions) อย่างเคร่งครัด
- ใช้สิทธิ์ไฟล์แบบ Least Privilege เช่น
- Linux: chmod 640 (อ่านได้เฉพาะเจ้าของและกลุ่ม)
- Windows: กำหนดสิทธิ์ให้เฉพาะ System และ Application User เท่านั้น
✅ 3. ป้องกันการอัปโหลดไฟล์ที่เป็นอันตราย
- ตรวจสอบประเภทไฟล์ (MIME Type) โดยไม่ใช้เพียงแค่ส่วนขยายไฟล์
- เปลี่ยนชื่อไฟล์ก่อนจัดเก็บ เพื่อป้องกันการรันไฟล์ที่อัปโหลดมา
✅ 4. ใช้ไฟล์ Proxy หรือ Script เพื่อดึงไฟล์แทน
- แทนที่จะให้ผู้ใช้เข้าถึงไฟล์โดยตรงผ่าน URL (https://example.com/uploads/file.jpg)
- ให้ใช้สคริปต์เป็นตัวกลาง เช่น PHP หรือ Node.js
- วิธีนี้ช่วยให้สามารถ ตรวจสอบสิทธิ์ก่อนให้ผู้ใช้ดาวน์โหลดไฟล์
✅ 5. ใช้ Content Security Policy (CSP) ป้องกันการรันไฟล์ที่เป็นอันตราย
- หากเว็บต้องแสดงผลไฟล์ที่ผู้ใช้อัปโหลด เช่น รูปภาพหรือเอกสาร ให้ตั้งค่า CSP Header ป้องกันการรันสคริปต์
- สรุป
- การเก็บไฟล์จากแหล่งไม่น่าเชื่อถือ ต้องจัดเก็บไว้นอก Web Root และ ต้องกำหนดสิทธิ์ไฟล์ให้จำกัดที่สุด เพื่อป้องกันการโจมตี เช่น RCE และ LFI วิธีปฏิบัติที่แนะนำคือ: ✅ เก็บไฟล์ไว้ในไดเรกทอรีที่ปลอดภัย นอก Web Root
✅ ใช้การตรวจสอบ MIME Type และเปลี่ยนชื่อไฟล์ก่อนบันทึก
✅ ใช้ Proxy หรือ Script เป็นตัวกลางในการเสิร์ฟไฟล์
✅ ตั้งค่าไฟล์ให้มีสิทธิ์ต่ำสุดและใช้ CSP
Gemini : การจัดเก็บไฟล์อย่างปลอดภัย
- จัดเก็บไฟล์ไว้นอกไดเรกทอรีรากของเว็บ: ไดเรกทอรีรากของเว็บคือตำแหน่งที่ไฟล์ทั้งหมดของเว็บไซต์ถูกจัดเก็บไว้ การจัดเก็บไฟล์จากแหล่งที่ไม่น่าเชื่อถือไว้นอกไดเรกทอรีนี้จะช่วยป้องกันไม่ให้ผู้โจมตีเข้าถึงไฟล์ได้โดยตรงผ่านทางเว็บเบราว์เซอร์
- กำหนดสิทธิ์ที่จำกัด: ตรวจสอบให้แน่ใจว่าไฟล์ที่จัดเก็บไว้มีการตั้งค่าสิทธิ์ที่จำกัด ผู้ใช้ที่ได้รับอนุญาตเท่านั้นจึงจะสามารถเข้าถึงไฟล์ได้
- ตรวจสอบไฟล์: ก่อนที่จะจัดเก็บไฟล์ใดๆ จากแหล่งที่ไม่น่าเชื่อถือ ตรวจสอบให้แน่ใจว่าไฟล์นั้นปลอดภัยและไม่มีซอฟต์แวร์ที่เป็นอันตราย
- ใช้การควบคุมการเข้าถึง: ใช้การควบคุมการเข้าถึงเพื่อจำกัดการเข้าถึงไฟล์ที่จัดเก็บไว้เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้น
- เข้ารหัสไฟล์: พิจารณาเข้ารหัสไฟล์ที่จัดเก็บไว้เพื่อเพิ่มความปลอดภัยอีกชั้นหนึ่ง
ตัวอย่าง
- สมมติว่าคุณมีเว็บไซต์ที่อนุญาตให้ผู้ใช้อัปโหลดไฟล์รูปภาพ คุณควรจัดเก็บไฟล์รูปภาพเหล่านี้ไว้นอกไดเรกทอรีรากของเว็บ เช่น ในไดเรกทอรีที่เรียกว่า “uploads” จากนั้นคุณสามารถใช้สคริปต์เพื่อดึงไฟล์รูปภาพและแสดงบนเว็บไซต์ของคุณได้
สรุป
- การจัดเก็บไฟล์อย่างปลอดภัยเป็นส่วนสำคัญของความปลอดภัยของเว็บไซต์ การทำตามแนวทางปฏิบัติที่ดีที่สุดเหล่านี้ คุณสามารถช่วยปกป้องข้อมูลของคุณจากการเข้าถึงโดยไม่ได้รับอนุญาต
My self : Files obtained from untrusted sources are stored outside the web root เป็น การตรวจสอบว่าไฟล์ที่ได้รับจากแหล่งที่ไม่น่าเชื่อถือถูกจัดเก็บไว้นอกเว็บรูท โดยมีสิทธิ์ที่จำกัด โดยควรมีการตรวจสอบที่รัดกุม การเก็บไฟล์จากแหล่งไม่น่าเชื่อถือ ต้องจัดเก็บไว้นอก Web Root และ ต้องกำหนดสิทธิ์ไฟล์ให้จำกัดที่สุด เพื่อป้องกันการโจมตี
✅ เก็บไฟล์ไว้ในไดเรกทอรีที่ปลอดภัย นอก Web Root
✅ ใช้การตรวจสอบ MIME Type และเปลี่ยนชื่อไฟล์ก่อนบันทึก
✅ ใช้ Proxy หรือ Script เป็นตัวกลางในการเสิร์ฟไฟล์
✅ ตั้งค่าไฟล์ให้มีสิทธิ์ต่ำสุดและใช้ CSP