后台登录安全防护
1. 强制强密码
无需插件,通过子主题的 functions.php
添加以下代码,强制用户设置强密码(至少包含大写、小写、数字和特殊字符):
<?php
// functions-strong-passwords.php
add_filter('user_profile_update_errors', 'esp_validate_password_strength', 10, 3);
function esp_validate_password_strength($errors, $update, $user) {
if (!empty($_POST['pass1'])) {
$password = $_POST['pass1'];
if (!preg_match('/[A-Z]/', $password)
|| !preg_match('/[a-z]/', $password)
|| !preg_match('/\d/', $password)
|| !preg_match('/[\W_]/', $password)
|| strlen($password) < 12) {
$errors->add('pass', '密码强度不足,需包含大小写字母、数字、特殊字符,且长度 ≥ 12');
}
}
}
2. 重命名或删除默认 “admin” 用户
在 MySQL 中运行以下查询,将 admin
用户名改为更难猜测的名称:
UPDATE wp_users
SET user_login = 'new_admin_name'
WHERE user_login = 'admin';
或删除该用户后重新创建:
DELETE FROM wp_users WHERE user_login = 'admin';
3. 隐藏登录 URL
安装并激活 WPS Hide Login 插件,然后在后台 设置 → WPS Hide Login 中配置自定义登录路径:
- 插件安装:
wp plugin install wps-hide-login --activate
- 设置新路径:输入
/my-secret-login
,保存后原/wp-login.php
与/wp-admin
将返回 404。Settings → General → WPS Hide Login → Login URL: /my-secret-login
4. 限制登录尝试
在子主题的 functions.php
中添加以下代码,实现对同一 IP 的登录次数限制(5 次封禁 15 分钟):
<?php
add_action('init', 'limit_login_attempts');
function limit_login_attempts() {
if (!session_id()) session_start();
$max = 5; $lock = 15*60;
if (isset($_POST['wp-submit'])) {
$u = sanitize_user($_POST['log'] ?? '');
$p = $_POST['pwd'] ?? '';
if (!empty($u) && !empty($p) && is_wp_error(wp_authenticate($u,$p))) {
$_SESSION['attempts'] = ($_SESSION['attempts'] ?? 0) + 1;
if ($_SESSION['attempts'] >= $max) $_SESSION['lock_time'] = time();
} else {
$_SESSION['attempts'] = 0;
}
}
if (isset($_SESSION['lock_time'])) {
$elapsed = time() - $_SESSION['lock_time'];
if ($elapsed < $lock) wp_die("尝试次数过多,请 {$lock - $elapsed} 秒后再试。");
else { unset($_SESSION['lock_time']); $_SESSION['attempts']=0; }
}
}
add_action('wp_logout', function(){ if(!session_id())session_start(); unset($_SESSION['attempts'],$_SESSION['lock_time']); });
5. 启用两步验证(2FA)
使用 WP-CLI 一行命令安装 Two-Factor 插件,并在用户 → 你的个人资料中启用 TOTP(谷歌验证器):
wp plugin install two-factor --activate
// 强制所有管理员角色开启 2FA(放入 mu-plugins)
add_filter('wpcom_vip_is_two_factor_forced','__return_true');
6. HTTP 基本认证保护 wp-admin
在 wp-admin
目录下创建 .htpasswd
和 .htaccess
:
.htpasswd
(使用htpasswd
工具生成):admin2:$apr1$abcdefgh$XYZ1234567890
wp-admin/.htaccess
:AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/.htpasswd Require valid-user
7. 强制后台 HTTPS
在 wp-config.php
中加入:
define('FORCE_SSL_ADMIN', true);
8. IP 白名单访问控制
使用 iptables
仅允许可信 IP 访问后台:
iptables -A INPUT -p tcp --dport 80 -m string --string "/wp-login.php" --algo bm -j DROP
iptables -A INPUT -p tcp -s 203.0.113.45 --dport 80 -m string --string "/wp-login.php" --algo bm -j ACCEPT
或在 Cloudflare Firewall Rules 中只放行指定 IP:
{
"action": "allow",
"filter": {"expression":"ip.src eq 203.0.113.45"},
"description":"Allow my office IP"
}
DDoS 与 CC 攻击防护
1. CDN 与 WAF(以 Cloudflare 为例)
-
速率限制:在 Security → WAF → Rate Limiting 中新增规则:
[ { "action":"challenge", "filter":{"expression":"http.request.uri.path eq \"/wp-login.php\""}, "description":"Challenge login floods" } ]
Bot 管理:启用 JavaScript Challenge 拦截脚本化请求。
2. Nginx 限速
在 Nginx 配置文件中加入:
http {
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
location /wp-login.php {
limit_req zone=login burst=5 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm.sock;
}
}
}
3. Apache mod_evasive
安装并启用模块后,在 /etc/apache2/mods-enabled/evasive.conf
添加:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
DOSEmailNotify [email protected]
</IfModule>
4. Fail2ban 异常检测
在 /etc/fail2ban/jail.local
中添加 WordPress 相关监控:
[wordpress]
enabled = true
filter = wp-login
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
并在 /etc/fail2ban/filter.d/wp-login.conf
中定义规则:
[Definition]
failregex = <HOST> .* "POST /wp-login.php
5. ModSecurity 限速与 CC 防护
在自定义规则文件(如 /etc/modsecurity/modsecurity_custom.conf
)中添加:
# 初始化 IP 集合
SecAction "phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},id:900001"
# 登陆页面速率限制:3 分钟内超过 10 次封禁 5 分钟
<LocationMatch "/wp-login.php">
SecRule IP:bf_block "@gt 0" "id:900002,deny,status:401,log,msg:'Blocked due to brute force'"
SecRule REQUEST_URI "@streq /wp-login.php" "phase:2,pass,nolog,setvar:ip.somepathcounter=+1,expirevar:ip.somepathcounter=180,id:900003"
SecRule IP:SOMEPATHCOUNTER "@gt 10" "phase:2,deny,status:429,log,msg:'Rate limit exceeded'"
</LocationMatch>
6. CAPTCHA 与人机验证
在 wp-login.php
或评论表单中插入 Google reCAPTCHA v3:
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('YOUR_SITE_KEY', {action: 'login'}).then(function(token) {
var f = document.getElementById('loginform');
var input = document.createElement('input');
input.setAttribute('type','hidden');
input.setAttribute('name','g-recaptcha-response');
input.setAttribute('value',token);
f.appendChild(input);
});
});
</script>
后端验证:
$response = wp_remote_post('https://www.google.com/recaptcha/api/siteverify',[
'body'=>['secret'=>'YOUR_SECRET','response'=>$_POST['g-recaptcha-response']]
]);
$data = json_decode(wp_remote_retrieve_body($response));
if (!$data->success || $data->score<0.5) wp_die('验证失败');
7. 日志监控与告警
- UptimeRobot:注册并添加监控 URL,即可通过邮件/短信获知宕机。
- Logwatch/ELK:在服务器上配置定时推送日志至 ELK,实时分析异常流量。
citeturn0search3