Security
xmlrpc.php คืออะไร และทำไมต้องปิด?
ไฟล์ xmlrpc.php เป็น API เก่าแก่ของ WordPress ที่ถูกสร้างขึ้นตั้งแต่ยุคแรก เพื่อให้แอปภายนอกสามารถเชื่อมต่อกับเว็บไซต์ได้โดยไม่ต้องเปิดเบราว์เซอร์ เช่น การโพสต์บทความผ่านแอปบนมือถือ หรือการ Ping บริการ Aggregator ต่าง ๆ อย่างไรก็ตาม ในยุคปัจจุบันที่ WordPress มี REST API ที่ทันสมัยกว่ารองรับอยู่แล้ว xmlrpc.php จึงกลายเป็นไฟล์ที่ไม่จำเป็นสำหรับเว็บส่วนใหญ่
ปัญหาใหญ่คือ xmlrpc.php เปิดช่องโหว่ให้แฮกเกอร์ใช้งานได้หลายรูปแบบ ได้แก่
- Brute Force Attack ซ้อน: xmlrpc.php รองรับ multicall ซึ่งแฮกเกอร์สามารถทดสอบรหัสผ่านได้หลายร้อยคู่ใน Request เดียว ทำให้ Brute Force เร็วกว่าผ่าน wp-login.php หลายเท่า
- DDoS Amplification: ผู้โจมตีสามารถใช้ xmlrpc.php เพื่อส่ง Pingback ไปยังเซิร์ฟเวอร์อื่น ทำให้เว็บของคุณถูกใช้เป็นเครื่องมือโจมตีเว็บไซต์อื่นโดยไม่รู้ตัว
- Resource Exhaustion: การส่ง Request จำนวนมากมายัง xmlrpc.php ทำให้เซิร์ฟเวอร์ใช้ CPU และ RAM สูงผิดปกติ ส่งผลให้เว็บช้าหรือล่มได้
- Data Exfiltration: หากแฮกเกอร์เดารหัสผ่านได้สำเร็จ สามารถดึงข้อมูล โพสต์ หรือแม้แต่ติดตั้งปลั๊กอินอันตรายผ่าน xmlrpc.php ได้
สถิติจากหลายบริษัท Security พบว่าเว็บ WordPress มากกว่า 80% ยังคงเปิด xmlrpc.php ไว้โดยไม่จำเป็น ทำให้เป็นเป้าหมายโจมตีอันดับต้น ๆ สำหรับบอทที่สแกนหาช่องโหว่ตลอดเวลา
วิธีปิด xmlrpc.php ผ่าน .htaccess (แนะนำสำหรับ Shared Hosting)
วิธีที่เร็วที่สุดและมีประสิทธิภาพสูงสุดสำหรับผู้ใช้ Shared Hosting คือการเพิ่มกฎใน .htaccess ที่ root ของเว็บไซต์ เพราะ Apache จะบล็อก Request ก่อนที่ PHP จะทำงาน ช่วยประหยัด Resource ได้มาก
ขั้นตอนผ่าน cPanel File Manager
- เข้า cPanel แล้วคลิก File Manager
- ไปที่โฟลเดอร์
public_html(หรือโฟลเดอร์ที่ติดตั้ง WordPress) - เปิดไฟล์ .htaccess (กด Show Hidden Files หากมองไม่เห็น)
- คลิก Edit แล้วเพิ่มโค้ดด้านล่างนี้ที่ส่วนบนของไฟล์
# Block xmlrpc.php completely
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
บันทึกไฟล์แล้วทดสอบโดยเปิดเบราว์เซอร์ไปที่ https://yoursite.com/xmlrpc.php ควรได้รับ HTTP 403 Forbidden กลับมา
วิธีบล็อก xmlrpc.php เฉพาะบาง Method (กรณีต้องการ Jetpack)
หากคุณยังต้องการใช้งาน Jetpack หรือแอปมือถือของ WordPress แต่อยากบล็อกการโจมตีประเภท Pingback และ Multicall ให้ใช้วิธีนี้แทน โดยเพิ่มโค้ดลงใน functions.php ของ Theme
// Disable XML-RPC Pingback only (keep other XML-RPC features)
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
// Disable XML-RPC completely (use this if you don't need Jetpack)
add_filter('xmlrpc_enabled', '__return_false');
วิธีนี้ทำผ่าน cPanel File Manager ได้เช่นกัน โดยไปที่ public_html/wp-content/themes/[ชื่อ theme ที่ใช้]/functions.php แล้วเพิ่มโค้ดที่ท้ายไฟล์ก่อน ?>
ปิด xmlrpc.php ด้วย Plugin (วิธีง่ายสำหรับมือใหม่)
หากไม่สะดวกแก้ไขไฟล์โดยตรง สามารถใช้ Plugin ที่ติดตั้งได้ง่ายผ่าน WordPress Dashboard ได้เลย
Plugin ที่แนะนำ
- Disable XML-RPC: Plugin เล็ก น้ำหนักเบา ติดตั้งแล้วเปิดใช้งานได้ทันทีไม่ต้องตั้งค่า บล็อก xmlrpc.php อย่างสมบูรณ์
- Wordfence Security: Security Suite ครบครัน รวมถึงการบล็อก xmlrpc.php, Brute Force Protection, Firewall, และ Malware Scanner
- iThemes Security (now Solid Security): มีตัวเลือก "Disable XML-RPC" ในหน้า Settings พร้อม Two-Factor Authentication และฟีเจอร์ความปลอดภัยอื่น ๆ
ขั้นตอนติดตั้ง Plugin
- เข้า WordPress Admin Panel (wp-admin)
- ไปที่ Plugins → Add New
- ค้นหา "Disable XML-RPC"
- คลิก Install Now แล้ว Activate
- Plugin จะทำงานอัตโนมัติโดยไม่ต้องตั้งค่าเพิ่มเติม
การตรวจสอบ Log ใน cPanel เพื่อดู Attack
ก่อนและหลังการบล็อก แนะนำให้ตรวจ Access Log เพื่อดูว่ามีการโจมตีเกิดขึ้นหรือไม่ ใน cPanel สามารถดูได้ที่
- เข้า cPanel แล้วคลิก Raw Access หรือ Metrics → Visitors
- Download Log ไฟล์มาเปิดดู หรือใช้ AWStats ใน cPanel
- กรองดู Request ที่ไปยัง
/xmlrpc.php
ถ้าพบว่ามี Request จำนวนมากจาก IP หลายพันตัวภายในเวลาสั้น ๆ นั่นคือสัญญาณของการโจมตีชัดเจน การปิด xmlrpc.php จะช่วยลด Log เหล่านี้ได้ทันที
ความปลอดภัยเพิ่มเติมที่ควรทำควบคู่กัน
การปิด xmlrpc.php เป็นเพียงหนึ่งในหลายมาตรการที่ควรทำเพื่อรักษาความปลอดภัย WordPress แนะนำให้ดำเนินการเพิ่มเติมดังนี้
- เปลี่ยน URL Login จาก
/wp-adminหรือ/wp-login.phpเป็น URL ที่ไม่คาดเดาได้ โดยใช้ Plugin เช่น WPS Hide Login - เปิดใช้งาน Two-Factor Authentication สำหรับบัญชี Admin ทุกบัญชี
- จำกัดจำนวนครั้งในการ Login ผิดพลาด (Login Attempt Limit)
- อัปเดต WordPress Core, Theme, และ Plugin ให้เป็นเวอร์ชันล่าสุดเสมอ
- ตั้งรหัสผ่านแบบ Strong Password ที่มีความยาวอย่างน้อย 16 ตัวอักษร ผสมตัวอักษร ตัวเลข และอักขระพิเศษ
- ติดตั้ง SSL Certificate เพื่อให้ข้อมูลส่งผ่าน HTTPS ทุกครั้ง
ตรวจสอบว่าการปิด xmlrpc.php ทำงานถูกต้อง
หลังจากบล็อก xmlrpc.php แล้ว ให้ทดสอบด้วยวิธีเหล่านี้เพื่อยืนยันว่าการตั้งค่าทำงานถูกต้อง
# ทดสอบด้วย curl จากเครื่องตัวเอง (ควรได้ 403 Forbidden)
curl -I https://yoursite.com/xmlrpc.php
# ทดสอบส่ง POST request ไปยัง xmlrpc.php (ควรได้ 403)
curl -X POST https://yoursite.com/xmlrpc.php -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>'
# ดู HTTP Status Code ที่ได้กลับมา
curl -o /dev/null -s -w "%{http_code}\n" https://yoursite.com/xmlrpc.php
# ตรวจสอบ Header ที่ server ส่งกลับมา
curl -v https://yoursite.com/xmlrpc.php 2>&1 | grep -E "HTTP|Forbidden|Allow"
# ทดสอบผ่านเครื่องมือออนไลน์ (ใส่ URL แล้วดู Response)
# https://xmlrpc.eritreo.it/ หรือ https://wpscan.com/
แก้ปัญหาที่พบบ่อย
Error: "403 Forbidden แต่เว็บหน้าอื่นก็เข้าไม่ได้ด้วย"
อาจเกิดจากโค้ดใน .htaccess ผิดพลาดหรือมีตัวอักษรแปลกปลอม ให้ตรวจสอบโค้ดที่เพิ่มใหม่อีกครั้ง โดยเฉพาะตรวจดูว่า Tag <Files> ปิดด้วย </Files> อย่างถูกต้อง และไม่มีช่องว่างพิเศษหรือ BOM character ต้นไฟล์
# โค้ดที่ถูกต้อง (ไม่มีช่องว่างพิเศษ)
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Error: "Jetpack ไม่ทำงานหลังจากบล็อก xmlrpc.php"
Jetpack บาง Feature เช่น Publicize และ Subscriptions ต้องการ xmlrpc.php ในการสื่อสารกับ WordPress.com Servers แทนที่จะบล็อกทั้งหมด ให้ใช้วิธีบล็อกเฉพาะ Pingback Method ใน functions.php แทน หรืออนุญาตเฉพาะ IP ของ WordPress.com ใน .htaccess
# อนุญาตเฉพาะ Automattic/WordPress.com IPs เท่านั้น
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
Allow from 192.0.64.0/18
Allow from 192.0.80.0/20
</Files>
Error: "ปิดแล้วแต่ยังเห็น Request ใน Log เยอะอยู่"
แม้จะบล็อก xmlrpc.php แล้ว บอทบางตัวยังคง Request ไปเรื่อย ๆ เพราะยังไม่ได้รับทราบว่ามีการบล็อก ซึ่งเป็นเรื่องปกติและ Request เหล่านั้นจะได้รับ 403 กลับไป ไม่ก่อให้เกิดความเสียหาย หาก Request มากเกินไปจนทำให้ Server ช้า ให้ติดต่อ Hosting Provider เพื่อขอให้บล็อกที่ระดับ Firewall
Error: "WordPress App บนมือถือ Login ไม่ได้"
แอป WordPress บน iOS และ Android รุ่นใหม่ใช้ REST API แทน xmlrpc.php แล้ว หากยังใช้แอปรุ่นเก่าอยู่ ให้อัปเดตแอปให้เป็นเวอร์ชันล่าสุด จากนั้น Login ใหม่โดยใช้ Application Passwords ที่สร้างจาก WordPress Admin แทนรหัสผ่านหลัก
Error: ".htaccess หายหรือถูก Overwrite หลัง Update
WordPress บางครั้ง Rewrite ไฟล์ .htaccess ตอนที่ Flush Rewrite Rules เช่น หลัง Update หรือเปลี่ยน Permalink Structure ทำให้โค้ดที่เพิ่มไปหายได้ แก้ไขโดยเพิ่มโค้ดบล็อก xmlrpc.php ไว้ที่ส่วนบนสุดของ .htaccess ก่อน # BEGIN WordPress เสมอ
# วางส่วนนี้ก่อน # BEGIN WordPress
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
...
# END WordPress
คำถามที่พบบ่อย
Q: การปิด xmlrpc.php จะทำให้ WordPress ทำงานผิดปกติไหม?
A: สำหรับเว็บส่วนใหญ่ ไม่มีผลกระทบ เพราะ WordPress ใช้ REST API แทน xmlrpc.php ไปนานแล้ว ยกเว้นในกรณีที่ใช้ Plugin เก่า ๆ บางตัว หรือแอปมือถือ WordPress รุ่นเก่ามากที่ยังพึ่งพา xmlrpc.php อยู่ แนะนำให้ทดสอบหลังบล็อกว่าฟีเจอร์ทุกอย่างยังทำงานได้ปกติ
Q: ต้องปิด xmlrpc.php ทุกเว็บ WordPress เลยไหม?
A: แนะนำอย่างยิ่งสำหรับเว็บที่ไม่ได้ใช้ Jetpack หรือแอป WordPress Mobile รุ่นเก่า การปล่อยให้ xmlrpc.php เปิดโดยไม่มีเหตุผลเป็นความเสี่ยงโดยไม่จำเป็น สำหรับเว็บที่ต้องใช้ Jetpack ให้บล็อกเฉพาะ Pingback Method แทนการบล็อกทั้งหมด
Q: หลังปิด xmlrpc.php แล้ว ยังต้องทำอะไรอีกเพื่อเพิ่มความปลอดภัย?
A: การปิด xmlrpc.php เป็นขั้นตอนแรกที่ดี แต่ยังมีสิ่งที่ควรทำเพิ่มเติม ได้แก่ การติดตั้ง Security Plugin เช่น Wordfence, การเปิดใช้ Two-Factor Authentication, การอัปเดต WordPress และ Plugin ให้เป็นเวอร์ชันล่าสุด, การสำรองข้อมูลเว็บสม่ำเสมอ และการติดตั้ง SSL Certificate เพื่อให้ข้อมูลทุกอย่างส่งผ่าน HTTPS