WordPress Admin Hardening: Secure Your Dashboard
Protect your WordPress admin area with IP restrictions, SSL enforcement, capability management, and security headers.
The WordPress admin area is the primary target for attackers. Compromising admin access gives full control over your site. Hardening the admin area adds crucial protection layers.
Admin Access Restrictions
IP Whitelist for Admin
# .htaccess in wp-admin/
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100$
RewriteCond %{REMOTE_ADDR} !^10\.0\.0\.$
RewriteRule ^(.*)$ - [R=403,L]
</IfModule>
PHP IP Check
// Restrict admin by IP
add_action('admin_init', 'wpfs_restrict_admin_ip');
function wpfs_restrict_admin_ip() {
$allowed_ips = array(
'192.168.1.100',
'10.0.0.50'
);
$client_ip = wpfs_get_client_ip();
if (!in_array($client_ip, $allowed_ips)) {
wp_die('Admin access restricted');
}
}
Force SSL for Admin
wp-config.php Setting
// Force SSL for admin and login
define('FORCE_SSL_ADMIN', true);
// Also force SSL for login
define('FORCE_SSL_LOGIN', true);
Redirect to HTTPS
# .htaccess SSL redirect for admin
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Admin User Security
Rename Admin Username
-- Change admin username (backup first)
UPDATE wp_users
SET user_login = 'secure_username'
WHERE user_login = 'admin';
UPDATE wp_users
SET user_nicename = 'secure_username'
WHERE user_nicename = 'admin';
Remove Admin User ID 1
User ID 1 is often targeted. Create a new admin and delete the original.
Disable File Editor
// wp-config.php
define('DISALLOW_FILE_EDIT', true);
// Also prevent plugin/theme installation
define('DISALLOW_FILE_MODS', true);
Security Headers for Admin
Add Headers via PHP
add_action('admin_init', 'wpfs_admin_security_headers');
function wpfs_admin_security_headers() {
// Prevent clickjacking
header('X-Frame-Options: DENY');
// XSS protection
header('X-XSS-Protection: 1; mode=block');
// Prevent MIME sniffing
header('X-Content-Type-Options: nosniff');
// Referrer policy
header('Referrer-Policy: strict-origin-when-cross-origin');
}
Session Management
Shorten Session Expiry
// Reduce auth cookie lifetime
add_filter('auth_cookie_expiration', 'wpfs_shorter_sessions');
function wpfs_shorter_sessions($expiration) {
// 2 hours instead of 2 days
return 2 * HOUR_IN_SECONDS;
}
// Force re-authentication for sensitive actions
add_action('admin_init', 'wpfs_require_fresh_auth');
function wpfs_require_fresh_auth() {
$sensitive_pages = array('users.php', 'options-general.php');
$current_page = basename($_SERVER['PHP_SELF']);
if (in_array($current_page, $sensitive_pages)) {
// Check if logged in recently
$login_time = get_user_meta(get_current_user_id(), 'last_login', true);
if (time() - $login_time > 1800) { // 30 minutes
wp_redirect(wp_login_url(admin_url($current_page)));
exit;
}
}
}
Disable Unnecessary Features
Remove Dashboard Widgets
add_action('wp_dashboard_setup', 'wpfs_remove_dashboard_widgets');
function wpfs_remove_dashboard_widgets() {
remove_meta_box('dashboard_incoming_links', 'dashboard', 'normal');
remove_meta_box('dashboard_plugins', 'dashboard', 'normal');
remove_meta_box('dashboard_primary', 'dashboard', 'side');
remove_meta_box('dashboard_secondary', 'dashboard', 'side');
remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
remove_meta_box('dashboard_recent_drafts', 'dashboard', 'side');
}
Hide WordPress Version
// Remove version from admin footer
add_filter('update_footer', '__return_empty_string', 11);
// Remove from generator meta
remove_action('wp_head', 'wp_generator');
Capability Restrictions
Limit Editor Capabilities
// Remove dangerous capabilities from editors
add_action('admin_init', 'wpfs_restrict_editor_caps');
function wpfs_restrict_editor_caps() {
$editor = get_role('editor');
$editor->remove_cap('unfiltered_html');
}
Admin Activity Monitoring
// Log all admin page visits
add_action('admin_init', 'wpfs_log_admin_access');
function wpfs_log_admin_access() {
$page = $_SERVER['REQUEST_URI'];
$user = wp_get_current_user();
wpfs_log_event('admin_access', array(
'page' => $page,
'user' => $user->user_login
));
}
Conclusion
Admin hardening creates multiple barriers for attackers. Combine IP restrictions, SSL, session management, and capability controls to protect your most sensitive area.
Written by Sarah Chen
WP Folder Shield Team