跳至正文
首页 » WordPress网站防护

WordPress网站防护

内容纲要

后台登录安全防护

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 中配置自定义登录路径:

  1. 插件安装
    wp plugin install wps-hide-login --activate
  2. 设置新路径:输入 /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,实时分析异常流量。
    citeturn0search3