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 | 功能全面 | 免费需求 |
安全加固不是一次性工作,需要持续监控和维护。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)