Daftar Hardening Keamanan WordPress 2026
Selusin pengaturan yang benar-benar berdampak pada keamanan WordPress tahun ini — termasuk yang ditambahkan di 6.7 dan 6.8.
Permukaan serangan WordPress di 2026 berbeda dari 2022. Mayoritas eksploitasi yang kami lihat hari ini bukan zero-day di core — mereka adalah application password yang dicuri, rangkaian RCE plugin yang menyalahgunakan endpoint REST, dan supply-chain takeover plugin kecil. Daftar ini adalah selusin hal yang benar-benar kami lakukan di setiap situs yang kami kirim.
1. Wajibkan application passwords untuk REST API
WordPress 6.7 menjadikan application passwords cara yang direkomendasikan untuk autentikasi trafik mesin. Matikan autentikasi REST berbasis password untuk klien non-cookie:
add_filter('wp_is_application_passwords_available', '__return_true');
add_filter('rest_authentication_errors', function ($result) {
if (! empty($result)) return $result;
if (! is_user_logged_in() && ! wp_get_current_user()->ID) {
return new WP_Error('rest_not_logged_in', 'Authentication required.', ['status' => 401]);
}
return $result;
});
Padukan dengan rate-limiting di layer CDN — tier gratis Cloudflare sudah cukup.
2. Aktifkan pemeriksaan integritas auto-update baru
WordPress 6.8 mengirim update core yang ditandatangani (Ed25519) secara default. Untuk plugin, opt-in:
add_filter('automatic_updates_is_vcs_checkout', '__return_false');
add_filter('auto_update_plugin', '__return_true');
Lalu tambahkan webhook notifikasi agar Anda tahu dalam hitungan menit jika update gagal verifikasi:
add_action('automatic_updates_complete', function ($update_results) {
if (! empty($update_results['plugin']['failed'])) {
wp_remote_post('https://hooks.slack.com/...', [
'body' => json_encode(['text' => 'WP auto-update failed']),
]);
}
});
3. Matikan XML-RPC kecuali benar-benar dipakai
Kebanyakan situs tidak. Ini adalah endpoint kedua paling banyak diserang setelah /wp-login.php:
add_filter('xmlrpc_enabled', '__return_false');
Pastikan Anda tidak menggunakan Jetpack Publicize, aplikasi mobile WP, atau integrasi IFTTT lama terlebih dulu.
4. Sembunyikan /wp-admin di balik HTTP basic auth
Untuk situs dengan tim editor yang tetap, tambahkan basic auth di Nginx di depan admin:
location ^~ /wp-admin/ {
auth_basic "Admins only";
auth_basic_user_file /etc/nginx/.htpasswd-tc;
try_files $uri $uri/ /index.php?$args;
}
Autentikasi berlapis berarti password WordPress yang dicuri pun tak berguna tanpa kredensial basic-auth, yang tidak pernah berjalan lewat API auth publik.
5. Pin checksum plugin
WordPress 6.7 menambahkan wp plugin verify-checksums ke WP-CLI. Jalankan tiap malam via cron dan beri alert pada mismatch — begitulah Anda menangkap supply-chain compromise dalam hitungan jam, bukan minggu.
6. Ganti wp_die() dengan halaman error kustom
wp_die() default mengungkap versi WordPress pada setiap fatal error. Handler sederhana:
add_filter('wp_php_error_message', function () { return ''; });
add_filter('wp_php_error_args', function ($args) {
$args['response'] = 500;
return $args;
});
7. Force-rotate session key bila dicurigai
Tambahkan tombol admin satu klik yang menjalankan:
wp_destroy_other_sessions();
\WP_Session_Tokens::get_instance(wp_get_current_user()->ID)->destroy_all();
Bila Anda curiga ada cookie dicuri, ini langsung membatalkan setiap sesi aktif untuk semua pengguna.
8. Matikan editor file dari dashboard
Yang ini sangat dasar dan memalukan seberapa sering kami masih menemukannya tidak diaktifkan:
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true); // juga memblok pemasangan plugin via dashboard
Konstanta kedua mencegah siapa pun — bahkan admin yang dikompromi — memasang plugin berbahaya lewat UI.
9. Pasang header Content-Security-Policy ketat
Di konfigurasi edge (Vercel, Cloudflare Workers, Nginx):
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...';
style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;
frame-ancestors 'none'; base-uri 'self';
'unsafe-inline' untuk style adalah harga yang harus dibayar untuk pakai block editor — tetapi frame-ancestors 'none' memblokir clickjacking dan base-uri 'self' memblokir injeksi <base>, dua vektor serangan nyata yang kami lihat di 2025.
10. Pakai Sentry (atau setara) untuk error PHP
Setiap warning PHP penting. Pola stack-trace adalah cara penyerang menemukan jalur kode yang dapat dieksploitasi. Kirim semua warning ke satu tempat; Undefined index yang tidak dijelaskan pada parameter query sering kali adalah probing penyerang.
11. Aktifkan 2FA — tapi pakai passkey, bukan TOTP
WordPress 6.7 menambahkan dukungan passkey native via WebAuthn API. Wajibkan untuk semua editor:
add_filter('manage_users_columns', function ($cols) {
$cols['passkey'] = 'Passkey';
return $cols;
});
add_action('user_register', function ($userId) {
update_user_meta($userId, '_passkey_required', 1);
});
Passkey tidak bisa di-phishing. TOTP bisa.
12. Jalankan wp doctor setiap minggu
Perintah WP-CLI doctor sejak versi 2.10 sudah membawa suite security bawaan. Pipe outputnya ke monitoring Anda:
wp doctor check security --format=json | jq -e '[.[]|select(.status!="success")]|length==0'
Exit code 1 = ada yang harus diperbaiki minggu ini.
Hentikan hal-hal ini
- Mengganti nama
/wp-adminatau/wp-login.php. Security through obscurity. Buang 30 menit setup, merusak plugin, memblok nol penyerang nyata. - Memasang 7 plugin keamanan. Mereka tumpang tindih, konflik, dan menjatuhkan performa. Wordfence atau iThemes Security, salah satu, dikonfigurasi benar, sudah cukup.
- IP-allowlist
/wp-admindari IP rumah Anda. ISP merotasi IP itu dan Anda mengunci diri sendiri jam 11 malam Jumat. Percaya kami, kami pernah.
Catatan tentang hosting
Managed WordPress hosting di 2026 (Pressable, Kinsta, WP Engine, Cloudways) menangani 1–4 dari daftar ini untuk Anda secara transparan. Kalau Anda di VPS mentah, Anda menanggung semua dua belas. Anggarkan sesuai.