ป้องกัน WordPress Login จาก Brute Force Attack

ล็อกหน้า Login ให้แน่น ด้วย Plugin, .htaccess และการตั้งค่าบน cPanel

ป้องกัน WordPress Login จาก Brute Force Attack Security

Brute Force Attack คือการที่ Bot หรือแฮกเกอร์พยายามเดา Username และ Password ของ WordPress ซ้ำแล้วซ้ำเล่า บางครั้งนับพัน-หมื่นครั้งต่อชั่วโมง จนกว่าจะเข้าได้สำเร็จ ซึ่งไม่เพียงเสี่ยงต่อการถูก Hack แต่ยังกินทรัพยากร Server ทำให้เว็บช้าลงอีกด้วย บทความนี้รวบรวมวิธีป้องกันที่ทำได้จริงบน Shared Hosting ผ่าน cPanel โดยไม่ต้องมีทักษะ Server

ทำไม wp-login.php ถึงเป็นเป้าหมายหลัก?

ไฟล์ wp-login.php คือประตูหลักของ WordPress ที่ทุกคนรู้ URL เพราะเหมือนกันทุกเว็บ Bot จึงสามารถโจมตีได้โดยอัตโนมัติโดยไม่ต้องสแกนเว็บก่อน นอกจากนี้ WordPress ค่าเริ่มต้นไม่มีการจำกัดจำนวนครั้งในการพยายาม Login ทำให้ Bot ลองได้ไม่จำกัด

สัญญาณที่บ่งบอกว่าเว็บถูก Brute Force อยู่ ได้แก่:

วิธีที่ 1: ติดตั้ง Plugin Limit Login Attempts Reloaded

วิธีที่ง่ายและเร็วที่สุดสำหรับผู้ใช้ Shared Hosting คือการใช้ Plugin ที่จำกัดจำนวนครั้งในการพยายาม Login

  1. เข้า WordPress Admin → Plugins → Add New
  2. ค้นหา Limit Login Attempts Reloaded
  3. กด Install Now แล้ว Activate
  4. ไปที่ Settings → Limit Login Attempts
  5. ตั้งค่า Lockout: 3 allowed retries / Lockout duration: 20 minutes
  6. เพิ่ม Email แจ้งเตือนเมื่อมี IP ถูก Lock
Tip: ถ้าเว็บอยู่หลัง Cloudflare ให้เปลี่ยน "Handle IPs from" เป็น "From HTTP_X_FORWARDED_FOR header" ไม่เช่นนั้น Plugin จะเห็น IP ของ Cloudflare แทน IP จริงของผู้ใช้

วิธีที่ 2: ป้องกัน wp-login.php ด้วย .htaccess Password

การเพิ่มชั้น Password ป้องกันก่อนที่ WordPress จะโหลด เป็นวิธีที่มีประสิทธิภาพมากเพราะ Bot จะหยุดตั้งแต่ Layer แรก โดยไม่ต้องโหลด PHP เลย ซึ่งช่วยลด Load Server ได้ทันที

สร้างไฟล์ .htpasswd ผ่าน cPanel → Password Protect Directories หรือสร้างด้วยตนเอง จากนั้นเพิ่มโค้ดต่อไปนี้ใน .htaccess ที่ root ของ WordPress:

# Protect wp-login.php with HTTP Authentication
<Files "wp-login.php">
  AuthType Basic
  AuthName "Admin Access"
  AuthUserFile /home/yourusername/.htpasswd
  Require valid-user
</Files>

# Block xmlrpc.php to prevent XML-RPC brute force
<Files "xmlrpc.php">
  Order Deny,Allow
  Deny from all
</Files>
Tip: เปลี่ยน /home/yourusername/ เป็น path จริงของ Hosting คุณ สามารถดูได้จาก cPanel → File Manager → คลิกขวาที่ไฟล์ใด → View File Information

วิธีที่ 3: บล็อก IP ด้วย cPanel IP Blocker

หากพบ IP ที่โจมตีซ้ำๆ สามารถบล็อกได้ทันทีผ่าน cPanel โดยไม่ต้องแก้ไข .htaccess เอง

  1. เข้า cPanel → Security → IP Blocker
  2. กรอก IP address หรือ IP Range ที่ต้องการบล็อก เช่น 192.168.1.0/24
  3. กด Add เพื่อบล็อกทันที

หากต้องการดู IP ที่น่าสงสัย ให้ตรวจสอบจาก cPanel → Metrics → Raw Access แล้วกรอง log เฉพาะ POST requests ไปที่ wp-login.php

วิธีที่ 4: ติดตั้ง Two-Factor Authentication (2FA)

แม้แฮกเกอร์จะเดา Password ได้ถูกต้อง 2FA จะทำให้ยังเข้าไม่ได้เพราะต้องการ Code จาก App บนมือถือด้วย นี่คือ Layer ป้องกันที่ทนทานที่สุด

  1. ติดตั้ง Plugin WP 2FA หรือ Google Authenticator – WordPress Two Factor Authentication
  2. Activate และทำตาม Setup Wizard
  3. สแกน QR Code ด้วย Google Authenticator หรือ Authy บนมือถือ
  4. ตั้งค่าให้ Admin accounts ต้องใช้ 2FA ทุกครั้ง
Tip: บันทึก Backup Codes ไว้ในที่ปลอดภัย เผื่อกรณีมือถือหาย จะได้ไม่ถูก Lock ออกจากเว็บตัวเอง

วิธีที่ 5: เปลี่ยน URL หน้า Login ด้วย WPS Hide Login

การเปลี่ยน URL Login จาก /wp-login.php เป็น URL อื่นที่คนภายนอกไม่รู้ จะทำให้ Bot ทั่วไปที่โจมตีตาม Default URL ไม่สามารถเจอหน้า Login เลย

  1. ติดตั้ง Plugin WPS Hide Login
  2. ไปที่ Settings → General → เลื่อนลงหา WPS Hide Login
  3. กำหนด Login URL ใหม่ เช่น /my-secret-door
  4. จด URL ใหม่ไว้ให้แน่ใจก่อน Save

หลังเปลี่ยนแล้ว การเข้า /wp-login.php จะถูก Redirect ไปหน้า 404 ทันที Bot จะไม่มีทางเจอหน้า Login เลย

วิธีที่ 6: ติดตั้ง Wordfence Security Firewall

Wordfence เป็น Security Plugin ระดับ Enterprise ที่ใช้ฟรีได้ มีระบบ WAF (Web Application Firewall) ป้องกัน Brute Force, Malware Scan และ IP Blocklist จาก Threat Intelligence ทั่วโลก

  1. ติดตั้ง Plugin Wordfence Security และ Activate
  2. ทำ Setup Wizard และกรอก Email รับการแจ้งเตือน
  3. ไปที่ Wordfence → Firewall → Manage Brute Force Protection
  4. เปิดใช้งาน: Lock out after X login failures, Lock out after X forgot password attempts
  5. เปิด "Immediately block IPs that try to sign in as 'admin'"
Tip: Wordfence Free ใช้ Threat Intelligence ที่ล่าช้า 30 วัน ถ้าต้องการ Real-time Protection สามารถ Upgrade เป็น Premium ได้ แต่สำหรับ Shared Hosting ทั่วไป เวอร์ชัน Free ก็เพียงพอมาก

แนวปฏิบัติเสริมที่ควรทำควบคู่กัน

นอกจาก Plugin และ .htaccess แล้ว ยังมีสิ่งที่ควรทำเพื่อเสริมความปลอดภัยให้ครบถ้วน:


ตรวจสอบว่าการป้องกัน WordPress Login ทำงานถูกต้อง

หลังตั้งค่าเสร็จแล้ว ให้ทดสอบผ่าน Browser และตรวจสอบ Log เพื่อยืนยันว่าระบบป้องกันทำงานจริง ใช้คำสั่งและวิธีต่อไปนี้:

# 1. ทดสอบว่า wp-login.php ถูกป้องกันด้วย HTTP Auth
# เปิด Browser ไปที่ URL นี้ ควรเจอ popup Username/Password ก่อน
https://yoursite.com/wp-login.php

# 2. ทดสอบว่า xmlrpc.php ถูกบล็อก (ควรได้ 403 Forbidden)
curl -I https://yoursite.com/xmlrpc.php

# 3. ทดสอบ Login ผิดพลาดเกินกำหนด
# ลอง Login ด้วย Password ผิด 3 ครั้ง แล้วตรวจสอบว่าถูก Lock
# ใน Wordfence: Wordfence > Firewall > Blocked IPs

# 4. ดู Access Log ผ่าน cPanel > Metrics > Errors
# กรอง POST /wp-login.php เพื่อดู Brute Force ที่ถูกบล็อก

# 5. ตรวจสอบ Wordfence Activity Log
# Wordfence > Scan > Results (ดู Blocked Login Attempts)
Tip: ใช้เว็บ SSL Labs หรือ Security Headers Checker เพื่อตรวจสอบ Header Security ของเว็บควบคู่ไปด้วย เพื่อให้ป้องกันได้ครบทุก Layer

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

Error: "Too Many Redirects" หลังเปลี่ยน Login URL

เกิดขึ้นเมื่อ Plugin WPS Hide Login ขัดแย้งกับการตั้งค่า Permalink หรือ Caching Plugin ให้ล้าง Cache ใน Plugin Caching ก่อน แล้ว Flush Permalinks โดยไปที่ Settings → Permalinks แล้วกด Save Changes โดยไม่เปลี่ยนอะไร

Error: "Sorry, you have been locked out" ทั้งที่ Password ถูกต้อง

เกิดจาก IP ของคุณถูกนับเป็น Bot หรือ Shared IP ของ ISP ถูก Blacklist แล้ว แก้ไขโดยเพิ่ม IP ของคุณใน Whitelist ผ่าน Wordfence → Firewall → Whitelist IPs หรือเข้า phpMyAdmin แล้วรัน Query:

-- Unlock IP ที่ถูกบล็อกโดย Limit Login Attempts Reloaded
DELETE FROM wp_options
WHERE option_name LIKE 'limit_login%'
   OR option_name LIKE 'llar_%';

-- หรือ Reset Wordfence blocked IPs (ใน wp_wfBlocks7)
DELETE FROM wp_wfBlocks7
WHERE type = 4
  AND IP = INET6_ATON('your.ip.address.here');

Error: .htpasswd ไม่ทำงาน แต่ยังเข้า wp-login.php ได้

ตรวจสอบ Path ของ .htpasswd ว่าถูกต้องหรือไม่ ต้องเป็น Absolute Path บน Server ไม่ใช่ URL เช่น /home/yourusername/.htpasswd ไม่ใช่ https://yoursite.com/.htpasswd สามารถหา Absolute Path ได้จาก cPanel → File Manager → คลิกขวาที่ไฟล์ → View File Information

Error: "xmlrpc.php blocked แต่ Jetpack ไม่ทำงาน"

Jetpack ใช้ XML-RPC ในการเชื่อมต่อกับ WordPress.com ถ้าบล็อก xmlrpc.php ทั้งหมดจะทำให้ Jetpack พัง แก้ไขโดยบล็อกเฉพาะ IP นอกไวท์ลิสต์ หรือเปลี่ยนมาใช้ Wordfence ที่สามารถบล็อก XML-RPC แบบ Selective ได้โดยอนุญาต Jetpack IP

Error: 2FA Plugin ทำให้ Login Loop ไม่สิ้นสุด

เกิดจาก Cookie หรือ Session ขัดแย้งกัน ให้ล้าง Cookie ใน Browser ทั้งหมด แล้วลอง Login ใหม่ หรือเข้าผ่าน Private/Incognito Window ถ้ายังไม่หาย ให้ใช้ FTP เข้าไปที่ wp-content/plugins/ แล้วเปลี่ยนชื่อโฟลเดอร์ Plugin 2FA เพื่อ Deactivate ชั่วคราว


คำถามที่พบบ่อย

Q: Brute Force Attack อันตรายแค่ไหน ถ้า Password ยาวมาก?

A: Password ที่ยาวมาก (16+ ตัวอักษร) ทำให้การ Brute Force ใช้เวลานับล้านปี แต่ความเสี่ยงยังคงอยู่ในอีกรูปแบบ เช่น Dictionary Attack (ลองคำที่พบบ่อย), Credential Stuffing (นำ Password ที่รั่วจากเว็บอื่น) หรือการโจมตีที่ทำให้ Server Overload จนเว็บล่ม การป้องกันหลายชั้นจึงจำเป็นอยู่ดี

Q: ใช้ Cloudflare ฟรีช่วยป้องกัน Brute Force ได้ไหม?

A: ช่วยได้มาก Cloudflare มี Bot Fight Mode (ฟรี) และ Rate Limiting สำหรับหน้า wp-login.php โดยเฉพาะ ตั้งค่าได้จาก Cloudflare Dashboard → Security → WAF → Rate Limiting Rules กำหนดไม่เกิน 5 requests ต่อนาทีต่อ IP สำหรับ URL /wp-login.php แต่ยังควรติดตั้ง Plugin ป้องกันในฝั่ง WordPress ด้วยเพื่อป้องกัน 2 ชั้น

Q: ถ้าลืม URL Login ที่เปลี่ยนไปด้วย WPS Hide Login ต้องทำอย่างไร?

A: ให้เข้า phpMyAdmin ผ่าน cPanel แล้วรัน Query เพื่อดึง URL Login ที่ตั้งไว้: SELECT option_value FROM wp_options WHERE option_name = 'whl_page'; หรือถ้าเข้า Database ไม่ได้ ให้ใช้ FTP เข้าไปเปลี่ยนชื่อโฟลเดอร์ Plugin WPS Hide Login ใน wp-content/plugins/ จะทำให้ URL กลับมาเป็น /wp-login.php ตามเดิมทันที