การแก้ปัญหาความปลอดภัยอันเนื่องมาจากต้องปรับ chmod ให้เป็น 777
ทำความเข้าใจเรื่องสิทธิของไฟล์และไดเร็คทอรี่กันก่อน
โดยทั่วๆไป ระบบไดเร็คทอรี่ของ Server จะถูกตั้งค่าเป็น 644 ซึ่งจะหมายความว่า เจ้าของสามารถ อ่านและเขียนได้ในขณะที่คนอื่นๆ อ่านได้อย่างเดียว
และ ไฟล์เป็น 755 หมายความว่า เจ้าของ สามารถทำได้ทุกอย่าง ในขณะที่คนอื่นๆ ไม่สามารถเขียนได้
จะเห็นว่า โดยปกติแล้ว เจ้าของ เท่านั้นที่สามารถจะเขียนได้
การแก้ปัญหาที่ทำกันโดยทั่วๆไป คือ ปรับ chmod ให้เป็น 777 เพื่อให้ทุกคนสามารถเขียนได้ แต่อย่างว่าละครับ 777 มันไม่ค่อยปลอดภัย
วิธีการแก้ปัญหา
เรารู้ว่า มีเจ้าของเท่านั้นที่สามารถเขียนไฟล์ได้ ดังนั้นการแก้ปัญหาคือ เราต้องทำตัวเป็นเจ้าของไฟล์ซะเอง มาดูกันก่อนว่าเจ้าของไฟล์มาจากไหน
เจ้าของไฟล์และไดเร็คทอรี่ ก็คือ user ที่สร้างไฟล์และไดเร็คทอรี่นั้นๆขึ้นมา ยกตัวอย่าง
- ในตอนที่เราสร้างเว็บไซต์ครั้งแรก เรามักจะอัปโหลดไฟล์ผ่าน ftp ดังนั้นไฟล์ที่อัปโหลดแล้วจะมีเจ้าของ (owner) เป็น user ของ ftp ที่เราใช้ login นั่นแหละครับ ดังนั้นเมื่อโค้ดของเราต้องการเขียนไฟล์ใดๆ จึงมักจะทำไม่ได้ เพราะสิทธิของเรา จะมีแค่อ่าน (สิทธิของคนที่เปิดเว็บผ่านบราวเซอร์คือ other ซึ่งบางโปรแกรมอาจเขียนเป็น public นะครับ)
- ในกรณีที่โค้ดของเรามีการเขียนไฟล์ใดๆขึ้นมา owner ของไฟล์ จะเป็น owner เดียวกันกับไฟล์ที่สร้าง ซึ่งปกติก็จะเป็น user เจ้าของไซต์หรืออาจเป็น default ของ PHP เองก็ได้ ซึ่งไฟล์หรือไดเร็คทอรี่ใดๆ ที่ถูกสร้างโดยโค้ด จะสามารถเขียนได้โดย PHP อยู่แล้ว เนื่องจากตัวเองเป็นเจ้าของ
การแก้ปัญหา
- จริงๆปัญหามันก็เริ่มมาตั้งแต่เราติดตั้งนั่นแหละครับ เพราะตอนเราติดตั้งเราอัปผ่าน ftp ทำให้เจ้าของคือ ftp ดังนั้นถ้าเป็นไปได้ เราก็แค่เปลี่ยนมาอัปโหลดไซต์ผ่าน Control Panel ของไซต์ (ซึ่งเป็น PHP แทน)
- วิธีที่ 2 คือให้เราสร้างไฟล์หรือไดเร็คทอรี่ใดๆ ที่ต้องการให้เขียนได้ด้วย PHP เช่นหากเราต้องการสร้างไดเร็คทอรี่ datas/ เพื่อใช้เก็บไฟล์ที่อัปโหลดโดย user ให้เราเขียนคำสั่ง PHP mkdir('/path/to/datas/'); แล้วเปิดเว็บเพื่อรันคำสั่งนี้ เราก็จะได้ไดเร็คทอรี่ datas/ ที่มีเจ้าของเป็น PHP ให้สามารถอัปโหลดได้ทันที ในกรณีที่มีไฟล์หรือไดเร็คทอรี่อยู่แล้ว เราสามารถเขียน PHP เพื่อเปลี่ยนเจ้าของได้ แต่วิธีที่ดีกว่าคือให้เขียนโปรแกรม เพื่อสำเนาไฟล์ไปยังไดเร็คทอรี่ อื่น เสร็จแล้วให้ลบไฟล์ต้นฉบับ และเปลี่ยนชื่อไฟล์ให้เหมือนเดิม เช่น ให้เรา สร้างไดเร็คทอรี่ _datas/ เสร็จแล้ว สำเนาไฟล์จาก datas/ ไปไว้ที่ _datas/ เสร็จแล้ว ทำการลบ datas/ เดิมออก และทำการ rename _datas/ เป็น datas/ เราก็จะได้ไดเร็คทอรี่ที่สามารถเขียนได้แล้ว
- วิธีที่ 3 ง่ายสุดๆ แต่เราต้องเป็นเจ้าของ Server เอง หรือ สามารถเข้าถึง Server ด้วย SSH ได้ โดยทำการรันคำสั่ง
chown -R username:group directory
แก้ไข username และ group ให้เป็น ชื่อ owner ของ PHP นะครับ (สามารถดูได้จากไฟล์อื่นๆ ให้ใช้ชื่อเดียวกัน) ส่วน directory ก็ให้ระบุชื่อไดเร็คทอรี่รวม path ที่ต้องการ
แค่นี้เราก็ไม่ต้องกำหนดให้ไฟล์และโฟลเดอร์ของเราเป็น 777 แล้ว