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 อยู่ ได้แก่:
- เว็บโหลดช้าผิดปกติ โดยเฉพาะช่วงดึก
- Log ของ cPanel เต็มด้วย POST requests ไปที่ /wp-login.php
- ได้รับอีเมลแจ้งการ Login ผิดพลาดจำนวนมาก
- Server CPU/Memory พุ่งสูงโดยไม่มีสาเหตุ
วิธีที่ 1: ติดตั้ง Plugin Limit Login Attempts Reloaded
วิธีที่ง่ายและเร็วที่สุดสำหรับผู้ใช้ Shared Hosting คือการใช้ Plugin ที่จำกัดจำนวนครั้งในการพยายาม Login
- เข้า WordPress Admin → Plugins → Add New
- ค้นหา Limit Login Attempts Reloaded
- กด Install Now แล้ว Activate
- ไปที่ Settings → Limit Login Attempts
- ตั้งค่า Lockout: 3 allowed retries / Lockout duration: 20 minutes
- เพิ่ม Email แจ้งเตือนเมื่อมี IP ถูก Lock
วิธีที่ 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>
/home/yourusername/ เป็น path จริงของ Hosting คุณ สามารถดูได้จาก cPanel → File Manager → คลิกขวาที่ไฟล์ใด → View File Informationวิธีที่ 3: บล็อก IP ด้วย cPanel IP Blocker
หากพบ IP ที่โจมตีซ้ำๆ สามารถบล็อกได้ทันทีผ่าน cPanel โดยไม่ต้องแก้ไข .htaccess เอง
- เข้า cPanel → Security → IP Blocker
- กรอก IP address หรือ IP Range ที่ต้องการบล็อก เช่น
192.168.1.0/24 - กด Add เพื่อบล็อกทันที
หากต้องการดู IP ที่น่าสงสัย ให้ตรวจสอบจาก cPanel → Metrics → Raw Access แล้วกรอง log เฉพาะ POST requests ไปที่ wp-login.php
วิธีที่ 4: ติดตั้ง Two-Factor Authentication (2FA)
แม้แฮกเกอร์จะเดา Password ได้ถูกต้อง 2FA จะทำให้ยังเข้าไม่ได้เพราะต้องการ Code จาก App บนมือถือด้วย นี่คือ Layer ป้องกันที่ทนทานที่สุด
- ติดตั้ง Plugin WP 2FA หรือ Google Authenticator – WordPress Two Factor Authentication
- Activate และทำตาม Setup Wizard
- สแกน QR Code ด้วย Google Authenticator หรือ Authy บนมือถือ
- ตั้งค่าให้ Admin accounts ต้องใช้ 2FA ทุกครั้ง
วิธีที่ 5: เปลี่ยน URL หน้า Login ด้วย WPS Hide Login
การเปลี่ยน URL Login จาก /wp-login.php เป็น URL อื่นที่คนภายนอกไม่รู้ จะทำให้ Bot ทั่วไปที่โจมตีตาม Default URL ไม่สามารถเจอหน้า Login เลย
- ติดตั้ง Plugin WPS Hide Login
- ไปที่ Settings → General → เลื่อนลงหา WPS Hide Login
- กำหนด Login URL ใหม่ เช่น
/my-secret-door - จด 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 ทั่วโลก
- ติดตั้ง Plugin Wordfence Security และ Activate
- ทำ Setup Wizard และกรอก Email รับการแจ้งเตือน
- ไปที่ Wordfence → Firewall → Manage Brute Force Protection
- เปิดใช้งาน: Lock out after X login failures, Lock out after X forgot password attempts
- เปิด "Immediately block IPs that try to sign in as 'admin'"
แนวปฏิบัติเสริมที่ควรทำควบคู่กัน
นอกจาก Plugin และ .htaccess แล้ว ยังมีสิ่งที่ควรทำเพื่อเสริมความปลอดภัยให้ครบถ้วน:
- อย่าใช้ Username ว่า "admin": เป็น Username แรกที่ Bot ลอง ให้สร้าง User ใหม่ที่มี Role Admin แล้วลบ "admin" ออก
- ใช้ Password ที่แข็งแกร่ง: ยาวอย่างน้อย 16 ตัวอักษร ผสมตัวเลข ตัวพิมพ์เล็ก-ใหญ่ และอักขระพิเศษ
- อัพเดท WordPress และ Plugin สม่ำเสมอ: ช่องโหว่ส่วนใหญ่ถูก Patch แล้วในเวอร์ชันใหม่
- ลบ Plugin และ Theme ที่ไม่ใช้: แม้จะ Deactivate อยู่ ก็ยังเป็นจุดอ่อนได้
- ใช้ Cloudflare Free: ช่วย Filter Bot Traffic ก่อนถึง Server จริง
ตรวจสอบว่าการป้องกัน 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)
แก้ปัญหาที่พบบ่อย
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 ตามเดิมทันที