POST /wp-login.php. Plugin itu memang bekerja, hanya saja ia bekerja di tempat yang terlalu dalam untuk melindungi resource server.
Kenapa plugin limit login tidak mengurangi beban PHP
Apa yang terjadi di satu request POST ke wp-login.php
- Web server menerima request dan melihat targetnya file PHP.
- Request diteruskan ke worker PHP. Kalau semua worker sedang sibuk, request antre.
- PHP memuat
wp-config.php, membuka koneksi ke MySQL, memuat core WordPress, tema, dan plugin aktif. - Plugin limit login mengecek apakah IP atau username sudah melewati batas. Pengecekan ini biasanya butuh query ke database.
- Kalau belum diblokir, WordPress memverifikasi password. Kalau gagal, plugin mencatat percobaan itu, sering kali dengan menulis ke database.
- Respons dikirim balik.
Membaca access log: sedikit IP agresif atau banyak IP pelan
/var/log/nginx/, di Apache di /var/log/apache2/ atau /var/log/httpd/, dan di cPanel tiap domain punya log sendiri di direktori domlogs. Ganti path di contoh berikut sesuai server kamu.
Langkah pertama, hitung IP mana yang paling sering mengirim POST ke wp-login.php:
BASH
grep 'POST /wp-login.php' /path/ke/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20BASH
grep 'POST /wp-login.php' /path/ke/access.log | awk '{print $4}' | cut -d: -f1-3 | uniq -c | tail -30[26/Oct/2026:16:41:54, dan cut memotongnya sampai menit. Hasilnya jumlah POST login per menit.
Dari dua hasil ini biasanya polanya kelihatan:
- Segelintir IP dengan jumlah request sangat tinggi. Ini serangan terkonsentrasi, paling gampang ditangani dengan blokir IP.
- Daftar IP panjang dengan jumlah kecil per IP, tapi total per menit tetap tinggi. Ini serangan terdistribusi. Blokir per IP akan terasa seperti main kejar-kejaran, dan plugin limit login hampir pasti tidak terpicu.
Memilih titik blokir: firewall, web server, atau WAF
- Batasi
wp-login.phphanya untuk IP tertentu. Cocok kalau admin selalu login dari IP kantor yang tetap. Tidak cocok untuk situs dengan banyak member yang login dari mana saja. - Pasang HTTP Basic Auth di depan
wp-login.php. Di Apache atau LiteSpeed bisa lewat blokFilesdi.htaccessdenganAuthType Basicdan file.htpasswd. Autentikasi ini diproses web server sebelum PHP jalan, jadi bot yang tidak tahu password Basic Auth langsung ditolak dengan 401. Cek dulu apakah ada plugin atau tema yang memanggilwp-login.phplewat AJAX, karena bisa ikut terkena. - Rate limit di web server. Ini menjaga login tetap terbuka tapi membatasi seberapa cepat satu klien boleh mencoba.
NGINX
# Di dalam blok http: zona memori 10 MB, 5 request per menit per IP (contoh)
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=5r/m;
# Di dalam blok server
location = /wp-login.php {
limit_req zone=wplogin burst=3 nodelay;
# Salin direktif fastcgi dari blok location ~ \.php$ yang sudah ada,
# karena location exact match ini mengambil alih request ke wp-login.php
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME document_rootfastcgi_script_name;
fastcgi_pass unix:/path/ke/php-fpm.sock;
}limit_req_status) tanpa memanggil PHP. Bagian fastcgi_pass wajib disesuaikan dengan socket atau port PHP-FPM di server kamu, lalu uji dengan nginx -t sebelum reload. Rate limit per IP tetap punya kelemahan yang sama dengan plugin saat serangan terdistribusi, tapi setidaknya penolakannya terjadi di level web server yang jauh lebih ringan.
Kalau serangannya besar dan terdistribusi, WAF atau CDN yang bisa memberi challenge khusus untuk path /wp-login.php biasanya opsi paling efektif, karena request bot berhenti sebelum masuk ke server. Fitur dan cara konfigurasinya berbeda per layanan, jadi cek dokumentasi WAF yang kamu pakai untuk rule berbasis path dan metode POST.
Hal yang sering terlewat saat memasang blokir
wp-login.php bukan satu-satunya pintu. xmlrpc.php juga menerima kredensial dan sering jadi target saat login form sudah diperketat. Kalau situs tidak memakai XML-RPC (misalnya untuk aplikasi mobile atau integrasi tertentu), blokir akses ke file itu di level web server juga. Jalankan perintah hitung di atas dengan mengganti path-nya untuk melihat apakah serangan pindah ke sana.
Ketiga, jangan langsung mencopot plugin limit login. Plugin itu masih berguna untuk hal yang tidak bisa dilakukan web server, seperti mengunci username tertentu, memberi notifikasi ke admin, atau mencatat percobaan dengan konteks WordPress. Peran yang tepat untuk plugin adalah lapisan terakhir untuk keamanan akun, bukan pertahanan utama untuk resource server.
Jadi kalau CPU tinggi padahal plugin limit login sudah aktif, mulai dari access log, bukan dari dashboard plugin. Hitung POST ke wp-login.php per IP dan per menit, tentukan apakah serangannya terkonsentrasi atau terdistribusi, lalu pindahkan blokirnya ke lapisan yang menolak request sebelum PHP sempat jalan. Setelah itu, cek ulang grafik CPU dan jumlah worker PHP yang aktif untuk memastikan blokirnya benar-benar memotong beban, bukan sekadar memindahkan serangan ke path lain.