WordPress安全加固完整指南

本文详解WordPress应用层安全加固,包括文件权限、防篡改和入侵检测。

为什么需要安全加固

攻击类型 影响 加固措施
暴力破解 账户被盗 限制登录尝试 + 2FA
恶意插件 后门/挂马 文件完整性监控
SQL注入 数据泄露 输入过滤 + 预处理
XSS攻击 用户Cookie被盗 输出转义
文件上传 Webshell 文件类型限制

一、文件权限加固

正确权限设置

# 网站根目录
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

# wp-config.php 特殊权限
chmod 600 /var/www/html/wp-config.php

# 禁止访问 .php 文件(Nginx)
location ~ /\. {
    deny all;
}

# 禁止执行PHP的目录
location /wp-content/uploads/ {
    location ~ \.php$ {
        deny all;
    }
}

配置文件保护

# 移动wp-config.php到网站根目录之上
mv wp-config.php /var/www/

# 在wp-config.php中指定
define('ABSPATH', dirname(__FILE__) . '/');

# 禁止访问敏感文件
<FilesMatch "(\.xml|\.xsl|\.jsp|\.do|\.svg)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

二、登录安全

限制登录尝试

// 在 functions.php 中添加
add_action('wp_login_failed', 'log_failed_attempt');
function log_failed_attempt() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient = get_transient('failed_login_' . md5($ip));
    $transient = $transient ? $transient + 1 : 1;

    set_transient('failed_login_' . md5($ip), $transient, 900);

    if ($transient >= 5) {
        wp_die('Too many failed attempts. Try again in 15 minutes.');
    }
}

强制使用强密码

add_action('user_profile_update_errors', 'validate_password');
function validate_password($errors) {
    $password = $_POST['pass1'];

    if (strlen($password) < 12) {
        $errors->add('password_too_short', 'Password must be at least 12 characters.');
    }

    if (!preg_match('/[A-Z]/', $password) || 
        !preg_match('/[a-z]/', $password) || 
        !preg_match('/[0-9]/', $password)) {
        $errors->add('password_weak', 'Password must include uppercase, lowercase, and numbers.');
    }
}

启用两因素认证 (2FA)

# 安装WP 2FA插件
wp plugin install wp-2fa --activate
配置:
1. WordPress后台 → WP 2FA
2. 选择 "One-time code via email" 或 "TOTP app"
3. 强制所有用户配置2FA
4. 备用验证码下载

三、数据库安全

修改表前缀

# 安装时修改
# wp-config.php 中设置
$table_prefix = 'wps_';  # 不要用 wp_

# 已安装站点修改(先备份!)
wp db query "
    RENAME TABLE wp_posts TO wps_posts,
                 wp_users TO wps_users,
                 ..."  # 需要列出所有表

禁用文件编辑

// wp-config.php
define('DISALLOW_FILE_EDIT', true);  // 禁止在线编辑主题/插件
define('DISALLOW_FILE_MODS', true);  // 禁止安装/更新插件(极致安全)

四、SQL注入防护

使用预处理语句

// ❌ 危险写法
$query = "SELECT * FROM wp_posts WHERE post_id = $id";
$result = $wpdb->get_results($query);

// ✅ 安全写法
$query = $wpdb->prepare("SELECT * FROM wp_posts WHERE post_id = %d", $id);
$result = $wpdb->get_results($query);

输入验证

// 始终验证和清理输入
$user_input = sanitize_text_field($_POST['user_input']);
$email      = sanitize_email($_POST['email']);
$url         = esc_url_raw($_POST['url']);

// 使用WordPress内置函数
wp_insert_post([
    'post_title'   => sanitize_text_field($_POST['title']),
    'post_content' => wp_kses_post($_POST['content']),
]);

五、XSS防护

输出转义

// ❌ 危险
echo $_GET['name'];

// ✅ 安全
echo esc_html($_GET['name']);

// 不同场景使用不同转义函数
echo esc_html($text);        // HTML标签转义
echo esc_attr($attribute);   // HTML属性转义
echo esc_url($url);          // URL转义
echo wp_kses_post($content); // 允许有限HTML

设置安全Headers

// 在主题的 functions.php 中添加
add_action('send_headers', function() {
    header('X-Content-Type-Options: nosniff');
    header('X-Frame-Options: SAMEORIGIN');
    header('X-XSS-Protection: 1; mode=block');
    header('Referrer-Policy: strict-origin-when-cross-origin');
    header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted-cdn.com;");
});

六、文件上传安全

限制文件类型

add_filter('upload_mimes', function($mimes) {
    // 只允许图片和PDF
    return [
        'jpg|jpeg|jpe' => 'image/jpeg',
        'png'          => 'image/png',
        'gif'          => 'image/gif',
        'pdf'          => 'application/pdf',
    ];
});

重命名上传文件

add_filter('sanitize_file_name', 'rename_uploaded_file', 10, 1);
function rename_uploaded_file($filename) {
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    return md5($filename . time()) . '.' . $ext;
}

七、文件完整性监控

使用Wordfence

wp plugin install wordfence --activate
Wordfence功能:
1. 文件完整性扫描(对比WordPress官方版本)
2. 恶意代码扫描
3. 实时威胁防御
4. 流量限速

手动监控(简单版)

#!/bin/bash
# /usr/local/bin/check_integrity.sh

WEB_ROOT="/var/www/html"
HASH_FILE="/var/backups/wordpress_hashes.txt"
ALERT_EMAIL="admin@example.com"

# 生成新哈希
find $WEB_ROOT -type f -name "*.php" -exec md5sum {} \; > /tmp/new_hashes.txt

# 对比
diff $HASH_FILE /tmp/new_hashes.txt > /tmp/changes.txt

if [ -s /tmp/changes.txt ]; then
    mail -s "WordPress File Change Detected" $ALERT_EMAIL < /tmp/changes.txt
fi

# 更新哈希文件
mv /tmp/new_hashes.txt $HASH_FILE
# 添加到crontab(每天检查)
0 2 * * * /usr/local/bin/check_integrity.sh

八、Web应用防火墙(WAF)

使用Cloudflare免费WAF

1. 域名NS指向Cloudflare
2. Firewall  Firewall Rules
3. 添加规则
   - (http.request.uri.path contains "/wp-admin")  Allow (Known IPs)
   - (http.request.uri.path contains "/wp-admin")  Block
   - (http.user_agent contains "bad-bot")  Block

Nginx层防护

# 阻止SQL注入
if ($query_string ~* "union.*select|insert|update|delete|drop|truncate|alter") {
    return 403;
}

# 阻止XSS攻击
if ($query_string ~* "<script.*</script>") {
    return 403;
}

# 限制请求大小
client_max_body_size 10M;

# 限制请求速率
limit_req_zone $binary_remote_addr zone=wp_login:10m rate=5r/m;
location = /wp-login.php {
    limit_req zone=wp_login burst=3 nodelay;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    include fastcgi.conf;
}

九、备份与恢复

自动备份脚本

#!/bin/bash
# /usr/local/bin/backup_wordpress.sh

DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/wordpress"
DB_NAME="wordpress"
DB_USER="backup_user"
DB_PASS="password"

# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# 备份文件
tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www/html

# 删除7天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
# 添加到crontab
0 2 * * * /usr/local/bin/backup_wordpress.sh

十、入侵检测与响应

检查被入侵的站点

# 1. 查找最近修改的PHP文件
find /var/www/html -name "*.php" -mtime -7 -ls

# 2. 查找可疑PHP函数
grep -r "eval *base64_decode *system *exec" /var/www/html/

# 3. 检查crontab
crontab -l
cat /var/spool/cron/*

应急响应流程

1. 断开网络连接保留证据
2. 从备份恢复选择入侵前的备份
3. 更新所有插件和主题
4. 重置所有用户密码
5. 更改数据库密码
6. 审计日志access.log, error.log
7. 修复漏洞
8. 恢复网络

安全加固检查清单

  • [ ] 文件权限正确(644文件 / 755目录)
  • [ ] wp-config.php 移动或权限600
  • [ ] 禁用文件编辑(DISALLOW_FILE_EDIT)
  • [ ] 修改数据库表前缀
  • [ ] 限制登录尝试
  • [ ] 启用2FA
  • [ ] 安装SSL证书(强制HTTPS)
  • [ ] 配置安全Headers
  • [ ] 安装WAF(Cloudflare或Nginx规则)
  • [ ] 文件完整性监控
  • [ ] 定期备份(数据库+文件)
  • [ ] 更新策略(自动更新安全补丁)

推荐安全插件

插件 功能 适合
Wordfence 综合安全(免费) 大多数站点
Sucuri WAF + CDN 高流量站点
iThemes Security 用户友好 新手
All In One WP Security 功能全面 免费需求

安全加固不是一次性工作,需要持续监控和维护。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。