2026年11月12日
2026年11月12日
สิทธิ์ไฟล์ (permission) ที่แนะนำสำหรับ WordPress: โฟลเดอร์ 755 ไฟล์ 644
บทความนี้เป็นฉบับปรับให้เหมาะกับท้องถิ่นจากต้นฉบับภาษาญี่ปุ่น อ่านต้นฉบับภาษาญี่ปุ่น
สิทธิ์ไฟล์ (permission) ของ WordPress ตามหลักพื้นฐานคือตั้งโฟลเดอร์เป็น 755 และไฟล์เป็น 644 ส่วน wp-config.php ซึ่งมีข้อมูลการเชื่อมต่อฐานข้อมูล ให้จำกัดผู้ที่อ่านได้ให้แคบลงอีก นอกจากตัวเลขแล้ว หากตรวจสอบด้วยว่าใครเป็นเจ้าของไฟล์ และ PHP ทำงานด้วยผู้ใช้คนใด ก็จะป้องกันได้ทั้งข้อมูลรั่วไหลและปัญหา "อัปเดตไม่ได้" ค่าที่แนะนำในบทความนี้มาจากการตรวจเอกสารทางการของ WordPress เรื่อง "Hardening WordPress" ณ พฤศจิกายน 2026
วิธีอ่านตัวเลขของ permission
permission แบ่งเป็น 3 ชุด คือ "เจ้าของ กลุ่ม และผู้อื่น" แต่ละชุดแทนด้วยผลรวมของ อ่าน (4) เขียน (2) และรัน (1)
| ค่า | รูปแบบ | ความหมาย |
|---|---|---|
| 755 | rwxr-xr-x | เจ้าของอ่าน เขียน และเข้าไปข้างในได้ ส่วนคนอื่นอ่านและเข้าไปข้างในได้เท่านั้น (สำหรับโฟลเดอร์) |
| 644 | rw-r--r-- | เจ้าของอ่านและเขียนได้ คนอื่นอ่านได้อย่างเดียว (สำหรับไฟล์) |
| 640 | rw-r----- | เจ้าของอ่านและเขียนได้ กลุ่มอ่านได้ ผู้อื่นทำอะไรไม่ได้ |
| 600 | rw------- | เฉพาะเจ้าของเท่านั้นที่อ่านและเขียนได้ |
| 440 / 400 | r--r----- / r-------- | ไม่มีใครเขียนได้ และอ่านได้เฉพาะเจ้าของ (กับกลุ่ม) |
"รัน (x)" ของโฟลเดอร์คือสิทธิ์ในการเข้าไปข้างในโฟลเดอร์นั้น หากเอา x ออกจากโฟลเดอร์ จะอ่านไฟล์ข้างในไม่ได้
ค่าที่ WordPress แนะนำ
| เป้าหมาย | ค่าที่แนะนำ | หมายเหตุ |
|---|---|---|
| โฟลเดอร์ | 755 (750 หากเป็นเซิร์ฟเวอร์ร่วมและไม่ต้องการให้คนอื่นเห็น) | แม้แต่การอัปเดตอัตโนมัติทางการ ก็ปรับโฟลเดอร์ให้เป็น 755 |
| ไฟล์ | 644 (640 ในกรณีเดียวกับข้างต้น) | แม้แต่การอัปเดตอัตโนมัติทางการ ก็ปรับไฟล์ให้เป็น 644 |
| wp-config.php | จำกัดให้เฉพาะตนเองและเว็บเซิร์ฟเวอร์อ่านได้ | คำอธิบายทางการคือ "โดยทั่วไป 400 หรือ 440" หากสภาพแวดล้อมที่ PHP ทำงานด้วยผู้ใช้เดียวกับเจ้าของไฟล์ 600 หรือ 400 ก็ทำงานได้ |
| .htaccess | 644 | หากให้ WordPress เขียนทับตอนบันทึกการตั้งค่าลิงก์ถาวร (permalink) ผู้ใช้ที่รัน PHP ต้องเขียนได้ |
| wp-content/uploads | โฟลเดอร์ 755 ไฟล์ 644 | ตั้งเจ้าของเป็นผู้ที่ผู้ใช้ที่รัน PHP เขียนได้ |
ไม่จำเป็นต้องตั้งเป็น 777 (ทุกคนเขียนได้) บนเซิร์ฟเวอร์ร่วม ผู้ใช้รายอื่นบนเซิร์ฟเวอร์เดียวกันอาจแก้ไขไฟล์ของคุณได้
ผู้ให้บริการเซิร์ฟเวอร์เช่าบางรายกำหนดค่าที่แนะนำเอง (เพราะวิธีรัน PHP ต่างกันไปตามเซิร์ฟเวอร์) หากคู่มือของเซิร์ฟเวอร์ที่ใช้อยู่ระบุค่าไว้ ให้ยึดตามนั้น
แนวคิดเรื่องเจ้าของไฟล์
ตามคำอธิบายทางการ ไฟล์ควรเป็นของบัญชีผู้ใช้ของตนเองและตนเองเขียนได้ เฉพาะไฟล์ที่ WordPress ต้องเขียน (uploads และธีมในกรณีที่ใช้ตัวแก้ไขธีม เป็นต้น) เท่านั้นที่ให้ปรับเจ้าของหรือกลุ่มให้ผู้ใช้ที่รัน PHP ของเว็บเซิร์ฟเวอร์เขียนได้
หากให้ผู้ใช้ของเว็บเซิร์ฟเวอร์เป็นเจ้าของทั้งหมดด้วยคำสั่งอย่าง chown -R www-data:www-data PHP จะแก้ไขไฟล์ทุกไฟล์ได้ ซึ่งทำให้ความเสียหายลุกลามง่ายเมื่อถูกโจมตีผ่านช่องโหว่ของปลั๊กอิน จึงควรตรวจสภาพปัจจุบันก่อนแล้วค่อยตัดสินใจ
การที่ระบบขอ "ข้อมูลการเชื่อมต่อ (ชื่อโฮสต์ FTP ชื่อผู้ใช้ รหัสผ่าน)" ตอนอัปเดตปลั๊กอินหรือแกนหลัก ส่วนใหญ่เกิดจากเจ้าของไฟล์ไม่ตรงกันนี้ WordPress จะเลือกวิธีแก้ไขไฟล์โดยตรงก็ต่อเมื่อเจ้าของไฟล์ที่ PHP สร้างกับเจ้าของไฟล์ของ WordPress เป็นคนเดียวกันเท่านั้น หากต่างกัน จะขอให้อัปเดตผ่าน FTP แทน ให้แก้ด้วยการปรับเจ้าของให้ตรงกัน ไม่ใช่ขยาย permission เป็น 777
ตรวจสอบการตั้งค่าปัจจุบัน
เข้าไปที่ไดเรกทอรีของ WordPress ผ่าน SSH แล้วตรวจค่าและเจ้าของด้วยคำสั่งต่อไปนี้ ให้ปรับ path ให้เหมาะกับสภาพแวดล้อมของตนเอง
cd /var/www/html
# ค่า เจ้าของ และกลุ่มของ wp-config.php
stat -c '%a %U:%G %n' wp-config.php
# ค้นหาไฟล์และไดเรกทอรีที่ผู้ใช้อื่นเขียนได้
find . -perm -o=w ! -type l
# ค้นหาไฟล์ PHP ใน uploads (โดยปกติจะไม่มี)
find wp-content/uploads -type f -name '*.php'
ผู้ใช้ที่รัน PHP เมื่อเข้าถึงผ่านเว็บ ให้ตรวจสอบจากการตั้งค่าของเซิร์ฟเวอร์ (user ของ pool ใน PHP-FPM เป็นต้น) หรือคู่มือของเซิร์ฟเวอร์เช่า ไม่จำเป็นต้องเป็นคนเดียวกับผู้ใช้ที่ล็อกอินผ่าน SSH
หากพบไฟล์ PHP ที่ไม่คุ้นตาใน uploads ให้สงสัยว่าถูกแก้ไขโดยไม่ชอบ และจดวันที่และเนื้อหาของไฟล์ไว้ก่อนลบ
แก้ permission ทีเดียวทั้งหมด
รันในไดเรกทอรีของ WordPress โดยสำรองข้อมูลก่อนรัน
cd /var/www/html
# ปรับโฟลเดอร์เป็น 755 และไฟล์เป็น 644
find . -type d -exec chmod 755 {} +
find . -type f -exec chmod 644 {} +
# จำกัด wp-config.php (ตัวอย่างสำหรับสภาพแวดล้อมที่ PHP ทำงานด้วยเจ้าของไฟล์)
chmod 600 wp-config.php
ค่าของ wp-config.php ให้เลือกตามสภาพแวดล้อมดังนี้
- PHP ทำงานด้วยผู้ใช้เดียวกับเจ้าของไฟล์ (เซิร์ฟเวอร์เช่าร่วมส่วนใหญ่ หรือ PHP-FPM แยกตามผู้ใช้): 600 หรือ 400
- เจ้าของเป็นบัญชีของตนเอง และเว็บเซิร์ฟเวอร์อ่านในฐานะกลุ่ม: ใช้ 640 หรือ 440 แล้วตั้งกลุ่มเป็นกลุ่มของเว็บเซิร์ฟเวอร์
# ตัวอย่าง: เจ้าของเป็นตนเอง กลุ่มเป็นเว็บเซิร์ฟเวอร์ (www-data) และตั้งเป็น 640
sudo chgrp www-data wp-config.php
chmod 640 wp-config.php
หลังตั้งค่าแล้ว ให้เปิดเว็บไซต์และหน้าผู้ดูแล แล้วตรวจว่าแสดงผลและล็อกอินได้ หากขึ้นหน้าจอว่างเปล่าหรือเกิดข้อผิดพลาด แสดงว่า PHP อ่าน wp-config.php ไม่ได้ ให้เปลี่ยนค่ากลับเป็น 644 แล้วตรวจเจ้าของและกลุ่มอีกครั้ง
หากตั้งเป็น 400 หรือ 440 ปลั๊กอินที่เขียนลง wp-config.php (เช่น ปลั๊กอินที่เขียนการตั้งค่าแคช) จะล้มเหลว ให้อนุญาตการเขียนชั่วคราวเฉพาะตอนตั้งค่าปลั๊กอินเหล่านั้น
ไม่ให้อ่าน wp-config.php ผ่านเว็บได้
หาก PHP ทำงานปกติ ต่อให้เข้า wp-config.php ผ่านเบราว์เซอร์ก็จะไม่แสดงเนื้อหา เพื่อป้องกันไม่ให้ซอร์สแสดงออกมาเมื่อ PHP หยุดทำงาน ควรปฏิเสธการเข้าถึงที่ฝั่งเว็บเซิร์ฟเวอร์ด้วย บน Apache 2.4 ให้เขียนต่อไปนี้ใน .htaccess ของไดเรกทอรีที่วาง WordPress (Order Deny,Allow / Deny from all แบบเก่าเป็นรูปแบบของ Apache 2.2)
<Files "wp-config.php">
Require all denied
</Files>
ขั้นตอนโดยละเอียดอธิบายไว้ใน "การตั้งค่าปฏิเสธการเข้าถึง wp-config.php"
ตัว .htaccess เองถูกปฏิเสธการเข้าถึงอยู่แล้วโดยการตั้งค่ามาตรฐานของ Apache (<Files ".ht*"> ใน httpd.conf)
ตามคำอธิบายทางการ ยังสามารถย้าย wp-config.php ขึ้นไปอยู่เหนือไดเรกทอรีที่วาง WordPress ขึ้นไป 1 ระดับได้ หากไม่มี wp-config.php ในไดเรกทอรีเดียวกัน WordPress จะหาในไดเรกทอรีที่อยู่เหนือขึ้นไป 1 ระดับ อย่างไรก็ตาม เอกสารทางการก็กล่าวถึงความเห็นว่าผลมีน้อย และกล่าวถึงว่าหากทำผิดวิธีจะกลับกลายเป็นอันตราย หากจะย้าย ให้ตรวจสอบว่าไดเรกทอรีที่อยู่เหนือขึ้นไป 1 ระดับไม่ใช่ไดเรกทอรีสาธารณะ
ไม่ให้รัน PHP ใน uploads
uploads เป็นไดเรกทอรีที่ WordPress เขียนลงไป จึงเป็นจุดที่ผู้โจมตีวางไฟล์ได้ง่าย หากตั้งไม่ให้รัน PHP ที่นี่ ต่อให้ถูกวางไฟล์ไว้ก็รันไม่ได้
บน Apache 2.4 ให้สร้าง wp-content/uploads/.htaccess แล้วเขียนต่อไปนี้
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
การใช้ Require ใน .htaccess ต้องได้รับอนุญาตจาก AllowOverride ฝั่งเซิร์ฟเวอร์ หากไม่ได้รับอนุญาต จะเกิดข้อผิดพลาด 500 หรือการตั้งค่าถูกละเลย หลังเขียนแล้ว ให้เปิด URL ของ PHP ที่ไม่มีอยู่จริง เช่น https://example.com/wp-content/uploads/test.php แล้วตรวจว่าได้ 403 (หากยังได้ 404 แสดงว่าการตั้งค่าไม่ทำงาน)
บน Nginx ให้วางต่อไปนี้ในบล็อก server โดยวางไว้ก่อน location ~ \.php$ ที่ประมวลผล PHP เนื่องจาก location แบบ regular expression จะถูกเทียบตามลำดับจากบนลงล่าง และใช้อันแรกที่ตรงกัน
location ~* ^/wp-content/uploads/.*\.(php|phtml|phar)$ {
deny all;
}
เมื่อเปลี่ยนการตั้งค่าแล้ว ให้ตรวจไวยากรณ์ด้วย nginx -t ก่อนจึงโหลดใหม่
อนึ่ง การอัปโหลดสื่อของ WordPress โดยมาตรฐานไม่รับไฟล์ที่ไม่ใช่ชนิดที่อนุญาต (รูปภาพ PDF เป็นต้น) โดยทั่วไปจึงอัปโหลดไฟล์ PHP เป็นสื่อจากหน้าผู้ดูแลไม่ได้
ข้อควรระวัง
- ก่อนเปลี่ยน permission ให้สำรองข้อมูลทั้งไฟล์และฐานข้อมูล
- หากเปลี่ยน permission ด้วยโปรแกรม FTP เซิร์ฟเวอร์บางแห่งอาจไม่รองรับการเปลี่ยนทีละหลายไฟล์ หากมีจำนวนมาก การใช้
findผ่าน SSH จะเร็วกว่าและไม่ตกหล่น - หากระบบขอข้อมูลการเชื่อมต่อ FTP ตอนอัปเดต อย่าขยาย permission ให้ตรวจเจ้าของไฟล์ ดู "วิธีแก้ข้อผิดพลาดเรื่อง permission ของ WordPress" ประกอบด้วย
- หากรันคำสั่งตรวจสอบข้างต้น (ไฟล์ที่ผู้ใช้อื่นเขียนได้ และ PHP ใน uploads) เป็นประจำ จะสังเกตเห็นการตั้งค่าที่เพี้ยนหรือการถูกแก้ไขโดยไม่ชอบได้เร็ว
มีคำถามเกี่ยวกับ WordPress ไหม ผู้เผยแพร่เว็บไซต์นี้อยู่ที่ญี่ปุ่นและตอบเป็นภาษาญี่ปุ่น ติดต่อ (ภาษาญี่ปุ่น)