ปิด xmlrpc.php WordPress ป้องกัน DDoS Attack

บล็อก xmlrpc.php ด้วย .htaccess และ Plugin ปิดช่องโหว่ที่ Hacker ใช้โจมตีเว็บ WordPress ของคุณ

ปิด xmlrpc.php WordPress ป้องกัน DDoS Attack Security

xmlrpc.php คืออะไร และทำไมต้องปิด?

ไฟล์ xmlrpc.php เป็น API เก่าแก่ของ WordPress ที่ถูกสร้างขึ้นตั้งแต่ยุคแรก เพื่อให้แอปภายนอกสามารถเชื่อมต่อกับเว็บไซต์ได้โดยไม่ต้องเปิดเบราว์เซอร์ เช่น การโพสต์บทความผ่านแอปบนมือถือ หรือการ Ping บริการ Aggregator ต่าง ๆ อย่างไรก็ตาม ในยุคปัจจุบันที่ WordPress มี REST API ที่ทันสมัยกว่ารองรับอยู่แล้ว xmlrpc.php จึงกลายเป็นไฟล์ที่ไม่จำเป็นสำหรับเว็บส่วนใหญ่

ปัญหาใหญ่คือ xmlrpc.php เปิดช่องโหว่ให้แฮกเกอร์ใช้งานได้หลายรูปแบบ ได้แก่

สถิติจากหลายบริษัท Security พบว่าเว็บ WordPress มากกว่า 80% ยังคงเปิด xmlrpc.php ไว้โดยไม่จำเป็น ทำให้เป็นเป้าหมายโจมตีอันดับต้น ๆ สำหรับบอทที่สแกนหาช่องโหว่ตลอดเวลา

วิธีปิด xmlrpc.php ผ่าน .htaccess (แนะนำสำหรับ Shared Hosting)

วิธีที่เร็วที่สุดและมีประสิทธิภาพสูงสุดสำหรับผู้ใช้ Shared Hosting คือการเพิ่มกฎใน .htaccess ที่ root ของเว็บไซต์ เพราะ Apache จะบล็อก Request ก่อนที่ PHP จะทำงาน ช่วยประหยัด Resource ได้มาก

ขั้นตอนผ่าน cPanel File Manager

  1. เข้า cPanel แล้วคลิก File Manager
  2. ไปที่โฟลเดอร์ public_html (หรือโฟลเดอร์ที่ติดตั้ง WordPress)
  3. เปิดไฟล์ .htaccess (กด Show Hidden Files หากมองไม่เห็น)
  4. คลิก Edit แล้วเพิ่มโค้ดด้านล่างนี้ที่ส่วนบนของไฟล์
# Block xmlrpc.php completely
<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

บันทึกไฟล์แล้วทดสอบโดยเปิดเบราว์เซอร์ไปที่ https://yoursite.com/xmlrpc.php ควรได้รับ HTTP 403 Forbidden กลับมา

หมายเหตุ: ถ้าคุณใช้ Jetpack Plugin หรือแอป WordPress Mobile บน iOS/Android บางฟีเจอร์อาจต้องการ xmlrpc.php แทนที่จะบล็อกทั้งหมด ให้ใช้วิธีบล็อกเฉพาะ IP ที่ไม่ต้องการแทน

วิธีบล็อก 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 ที่แนะนำ

ขั้นตอนติดตั้ง Plugin

  1. เข้า WordPress Admin Panel (wp-admin)
  2. ไปที่ Plugins → Add New
  3. ค้นหา "Disable XML-RPC"
  4. คลิก Install Now แล้ว Activate
  5. Plugin จะทำงานอัตโนมัติโดยไม่ต้องตั้งค่าเพิ่มเติม

การตรวจสอบ Log ใน cPanel เพื่อดู Attack

ก่อนและหลังการบล็อก แนะนำให้ตรวจ Access Log เพื่อดูว่ามีการโจมตีเกิดขึ้นหรือไม่ ใน cPanel สามารถดูได้ที่

  1. เข้า cPanel แล้วคลิก Raw Access หรือ Metrics → Visitors
  2. Download Log ไฟล์มาเปิดดู หรือใช้ AWStats ใน cPanel
  3. กรองดู Request ที่ไปยัง /xmlrpc.php

ถ้าพบว่ามี Request จำนวนมากจาก IP หลายพันตัวภายในเวลาสั้น ๆ นั่นคือสัญญาณของการโจมตีชัดเจน การปิด xmlrpc.php จะช่วยลด Log เหล่านี้ได้ทันที

ความปลอดภัยเพิ่มเติมที่ควรทำควบคู่กัน

การปิด xmlrpc.php เป็นเพียงหนึ่งในหลายมาตรการที่ควรทำเพื่อรักษาความปลอดภัย WordPress แนะนำให้ดำเนินการเพิ่มเติมดังนี้


ตรวจสอบว่าการปิด 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/
Tip: ผลลัพธ์ที่ถูกต้องคือ HTTP 403 Forbidden หรือ 404 Not Found ถ้ายังได้ 200 OK แสดงว่า xmlrpc.php ยังเปิดอยู่ ให้ตรวจสอบว่าบันทึกไฟล์ .htaccess ถูกต้องและอยู่ในโฟลเดอร์ที่ถูกต้อง นอกจากนี้ควรทดสอบทั้งจาก Browser และ curl เพราะบางครั้ง Browser Cache อาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง

แก้ปัญหาที่พบบ่อย

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