chmod 777 คืออะไร ทำไมต้อง chmod และมันไม่ปลอดภัยจริงหรือ
ทำความเข้าใจกับสิทธิ์หรือ Permissions กันก่อน
จริงๆแล้วสิทธิ์เป็นเรื่องของความปลอดภัยพื้นฐาน ใช้เพื่อบอกว่า "ใคร" สามารถ "ทำอะไร" ได้บ้าง ใคร แบ่งออกเป็น 3 กลุ่ม ได้แก่
- Owner หรือเจ้าของ เป็นชื่อผุ้ใช้งานภายในเครื่อง หรือผู้ที่สร้างไฟล์หรือไดเร็คทอรี่นั้นๆขึ้นมา (เช่น root ftp)
- Group กลุ่มของเจ้าของ ใช้จัดกลุ่มผู้ใช้งานเป็นกลุ่มๆ อีกที
- Public คือผุ้ใช้ทั่วไป บางทีอาจเรียก Other หรืออื่นๆ ได้แก่ผู้ใช้ที่เรียกใช้ไฟล์ หรือเปิดดูไฟล์นั้นๆ ที่ไม่ได้เป็น Owner และไม่ได้อยู่ใน Group รวมถึงคนที่เรียกดูจากอินเตอร์เน็ตด้วย
- Read สามารถอ่านไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถอ่านไฟล์นั้นได้ หรือถ้าเป็นไดเร็คทอรี่ก็จะสามารถแสดงรายชื่อไฟล์ในไดเร็คทอรี่ได้
- Write สามารถเขียนไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถเขียนไฟล์ แก้ไขไฟล์ สร้างไฟล์หรือไดเร็คทอรี่ ลบไฟล์หรือไดเร็คทอรี่ ได้
- Execute สามารถประมวลผลไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถสั่งประมวลผลไฟล์ได้ (เช่นให้ไฟล์ PHP ประมวลผล)
- 0 คือ ไม่สามารถทำอะไรได้เลยกับ Files หรือ Folder นั้นๆได้เลย
- 1 คือ สามารถเรียกให้ Files หรือ Folder มาประมวลผลอย่างเดียว
- 2 คือ สามารถให้มีการเขียนใน Files หรือ Folder ได้
- 3 คือ สามารถให้มีการเขียนและประมวลผล ใน Files หรือ Folder ได้
- 4 คือ สามารถเรียกให้ Files หรือ Folder มาอ่านได้อย่างเดียว
- 5 คือ สามารถให้มีการอ่านและประมวลผล ใน Files หรือ Folder ได้
- 6 คือ สามารถให้มีการอ่านและเขียน ใน Files หรือ Folder ได้
- 7 คือ การกำหนดให้ Files หรือ Folder ทำได้ทุกอย่าง อ่าน เขียน และประมวลผล
ตัวอย่างการกำหนดสิทธิ์
Owner | Group | Public |
---|---|---|
7 | 7 | 5 |
- Owner สามารถอ่าน เขียน และประมวลผลได้
- Group สามารถอ่าน เขียน และประมวลผลไฟล์ ได้เช่นกัน
- Public สามารถอ่าน และประมวลผลไฟล์ แต่ไม่สามารถเขียนได้
เกิดอะไรขึ้นเมื่อมีการเขียนไฟล์ หรือสร้างไดเร็คทอรี่ หรือ อัปโหลดไฟล์
- เมื่อเราใช้ ftp ในการอัปโหลดไฟล์ ผู้ที่สร้างไฟล์ก็คือ user ที่เราใช้ login เข้า ftp และ user นั้นก็จะเป็นเจ้าของไฟล์
- เมื่อเราใช้ php ในการสร้างไฟล์ เช่นการอัปโหลดไฟล์โดยการ submit ผ่านฟอร์ม หรือสร้างไฟล์ด้วย fopen() หรือคำสั่งอื่นๆของ php ก็จะได้ user เจ้าของไฟล์เป็นคนเดียวกันกับ php
การแก้ไข
- วิธีที่ง่ายที่สุดคือปรับ chmod ให้สามารถเขียนได้ (หรือต้องปรับให้ Public เป็น 7 นั่นเอง) เนื่องจากถ้าเป็นค่าอื่นจะไม่มีทางเขียนได้ ซึ่งวิธีนี้จะสามารถทำผ่าน ftp ได้ทุกคน (ไม่สอนวิธีปรับนะ มีสอนกันเยอะแยะแล้ว) หรือ
- วิธีที่สอง แก้ไขเจ้าของไฟล์ที่เราอัปโหลดผ่าน ftp ให้เป็นเจ้าของเดียวกันกับ php วิธีนี้ยุ่งยากมากที่สุดและอาจไม่สามารถทำได้ทุกคน เนื่องจากหาก Control Panel ที่ใช้ไม่สนับสนุน และไม่สามารถใช้ Command Line ได้ จะไม่สามารถทำได้เลย หลักการก็คือให้รันคำสั่ง chown เพื่อเปลี่ยนเจ้าของไฟล์
chown username:username index.php
chown -R username:username datas/- username คือ ชื่อ user เจ้าของไฟล์ ตัวแรกคือชื่อ user และตัวที่สองคือชื่อกลุ่ม ซึ่ง Server ส่วนใหญ่มักจะใช้ค่าเดียวกัน หากใครไม่รู้สามารถดูได้จาก Control Panel ของตัวเอง (เช่นที่ไดเร็คทอรี่ public_html ว่าเจ้าของเป็นใคร)
- -R เป็นคำสั่งใช้กับไดเร็คทอรี่ หมายถึงไดเร็คทอรี่นั้นๆและไดเร็คทอรี่และไฟล์ทั้งหมดในไดเร็คทอรี่นั้นด้วย
- วิธีสุดท้าย ที่ผมแนะนำ คือเมื่อเรารู้ว่าเจ้าของไฟล์เท่านั้นที่สามารถเขียนได้ และเราต้องการให้ php สามารถอัปโหลดไฟล์ได้ เราก็เขียนคำสั่งสร้างไฟล์หรือไดเร็คทอรี่ด้วย php มันซะเลย เพียงแค่นี้ เราก็จะสามารถอัปโหลดไฟล์ไปยังไดเร็ตทอรี่นั้นๆได้โดยไม่ต้องกังวลเรื่องสิทธิ์อีก ซึ่ง CMS รุ่นใหม่ๆในปัจจุบันใช้วิธีนี้
มาถึงคำถามที่หลายๆคนสงสัย chmod 777 ไม่ปลอดภัยจริงหรือ
คำตอบจากผมคือ มันมีความปลอดภัยต่ำที่สุด ก็อย่างที่อธิบายไป มันจะสามารถทำได้ทุกอย่าง แล้วมันจะไม่ปลอดภัยเมื่อไร (จริงๆแล้ว ตัวเลขที่ไม่ปลอดภัยที่สุดคือเลข 7 หลักสุดท้าย เพราะมันเป็นสิทธิ์ของคนทั่วไป หรือคนที่อยู่นอก Server)
เรามาลองดูกันนะครับว่าจะเกิดอะไรขึ้นได้บ้างเมื่อมีการปรับ chmod เป็น 777 หรือ xx7 (สองตัวแรกสามารถเป็นอะไรก็ได้) ลองทำตามนี้ดู
หนึ่ง สร้างไฟล์ PHP รายละเอียดตามนี้บน Server ของคุณเอง
<?php
$file = '/path/to/directory/test.php';
// เขียนไฟล์ลงบนปลายทาง
$f = fopen($file, 'wb');
fwrite($f, date('Y-m-d H:i:s').'<?php echo __FILE__;');
fclose($f);
// ตรวจสอบว่าสามารถสร้างไฟล์ได้หรือไม่
echo file_get_contents($file);
สอง แก้ไขตัวแปร $file ให้ชี้ไปยังไดเร็คทอรี่ของ Server อื่นๆ ภายในเครื่องเดียวกัน ที่ปรับ chmod ให้เป็น 777 แล้ว
สาม เรียกไฟล์นี้ ถ้าเห็นวันที่แสดงขึ้นมา แสดงว่าสามารถเขียนไฟล์นี้ลงบน Server ปลายทางได้สำเร็จ
สี่ ลองเรียกไฟล์ที่สร้างด้วย URL ปลายทางดู ถ้าสามารถประมวลผลไฟล์ที่เรียกได้ (แสดง path ของไฟล์) แสดงว่าโดนเข้าเรียบร้อยแล้ว
ลองปรับ chmod ของไดเร็คทอรี่ปลายทางเป็นค่าอื่นดูนะครับ และหลังจากลองเสร็จแล้ว อย่าลืมปรับ chmod กลับเป็นค่าเดิม และลบไฟล์ทั้งหมดที่สร้างด้วยนะครับ
จากตัวอย่างจะเห็นว่าความน่ากลัวสูงสุดมันจะอยู่ตรงที่ เราสามารถรันด้วยคำสั่งพื้นฐานง่ายๆของ PHP ได้เลย โดยไม่ต้องใช้ความรู้อะไรมาก แต่เงื่อนไขที่จะสำเร็จได้ก็มีอยู่
- เราต้องได้รับสิทธิ์ในการสร้างและประมวลผลไฟล์บน Server เดียวกัน (หรือ share Host ที่หมายถึงเว็บอื่นๆบน Server เดียวกันนั่นแหละครับ)
- เราจะต้องรู้ Path เต็มๆของไดเร็คทอรี่ปลายทาง และไดเร็คทอรี่นั้นต้องมีสิทธิ์เป็น xx7
- การตั้งค่า Server ที่ไม่ดีพอ
ทำไมถึงยังมีการใช้คำว่า chmod 777 กันอยู่อีก .... จริงๆแล้วประโยคนี้เป็นคำอธิบายสั้นๆว่าต้องปรับไดเร็คทอรี่ให้สามารถเขียนได้ ซึ่งสำหรับผู้ใช้พื้นฐานทั่วไป การบอกให้ผู้ใช้เข้าใจว่าต้องทำอะไรบ้างที่ดูยุ่งยากมักจะไม่สำเร็จ เพราะก็อย่างที่เห็นกันอยู่ คนจำนวนมากจับเอาเฉพาะข้อความแค่ที่ตัวเองอยากจะสนใจ หรือไม่ก็ไม่ชอบอ่าน หรือ ไม่ชอบทำอะไรที่ดูยุ่งยาก ก็เลยไม่ค่อยจะใส่ใจที่จะทำความเข้าใจ ยกเว้นในกลุ่ม DEV ด้วยกันเอง ที่มักบอกต่อๆกันว่า 777 มันไม่ดี แต่ก็ไม่รู้ว่ามันไม่ดียังไง
สุดท้าย สำหรับคนที่มีปัญหาการปรับ chmod และต้องการตัวช่วย ผมแนะนำโปรแกรมนี้เลย https://github.com/goragod/filemanager เป็นโปรแกรมจัดการไฟล์บน Server คล้ายๆ FTP แต่เนื่องจากมันเป็น PHP base ดังนั้นการอัปโหลดหรือการสร้างไฟล์ใดๆจากโปรแกรมนี้จะสามารถเขียนได้แน่นอน แต่โปรแกรมนี้เป็นโปรแกรมค่อนข้างอันตรายนะครับ (เนื่องจากความสามารถของมัน) ทำให้ถูกใช้เป็นเครื่องมือของ Hacker และโปรแกรมตรวจสอบไวรัสบางตัวมองว่าเป็นไฟล์อันตราย เมื่อใช้เสร็จแล้วต้องลบทิ้งทันที
คำเตือน การละเลยเรื่องความปลอดภัยแม้เพียงเล็กน้อยก็ถือเป็นอันตรายอย่างยิ่ง เนื่องจากโลกปัจจุบัน Hacker ก็ฉลาดขึ้น เครื่องมือก็เยอะขึ้น ช่องโหว่ของ Server ก็ถูกค้นพบไม่เว้นแต่ละวัน การละเลยแม้แต่เรื่องเล็กน้อยในตอนนี้ ก็อาจก่อให้เกิดปัญหาใหญ่ตามมาในภายหลังได้