安全防护
WordPress 安全是每个站长必须重视的问题。本章节详细介绍 WordPress 安全防护措施和最佳实践。
🛡️ 安全防护清单
mermaid
mindmap
root((WordPress 安全))
主机层
HTTPS 加密
服务器防火墙
定期备份
WordPress 核心
及时更新
强密码策略
双因素认证
插件主题
来源可信
定期更新
最小化安装
代码层
数据验证
输出转义
SQL 注入防护
监控层
登录日志
文件监控
安全扫描1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
🔐 基础安全配置
wp-config.php 安全设置
php
<?php
// =====================
// 基础安全配置
// =====================
// 禁用 XML-RPC(防止暴力攻击)
add_filter('xmlrpc_enabled', '__return_false');
// 禁用 REST API(仅限需要时)
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
// 移除 WP 版本号
remove_action('wp_head', 'wp_generator');
// 禁止目录浏览
Options -Indexes
// 限制文件上传类型
add_filter('upload_mimes', function($mimes) {
return array(
'jpg|jpeg|jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'pdf' => 'application/pdf',
);
});1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
用户安全
php
<?php
// =====================
// 用户安全配置
// =====================
// 强制使用强密码
add_action('wp_enqueue_scripts', function() {
if (is_user_logged_in()) {
wp_enqueue_script('password-strength-meter');
}
});
// 禁用用户端点
add_action('init', function() {
// 禁用 /wp-json/wp/v2/users
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
});
// 登录失败通知
add_action('wp_login_failed', function($username) {
$to = get_option('admin_email');
$subject = '登录失败通知';
$message = sprintf('有人尝试使用用户名 %s 登录失败', $username);
wp_mail($to, $subject, $message);
});1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
🛡️ 安全防护清单
::: checklist 必做安全措施
- [ ] 使用 HTTPS
- [ ] 更改默认管理员用户名
- [ ] 使用强密码(12位以上,混合字符)
- [ ] 限制登录尝试次数
- [ ] 启用双因素认证
- [ ] 定期更新 WordPress、主题、插件
- [ ] 安装安全插件(如 Wordfence, Sucuri)
- [ ] 定期备份网站
- [ ] 禁用文件编辑功能
- [ ] 保护 wp-config.php 文件
- [ ] 使用防火墙
- [ ] 监控异常登录 :::
🔒 高级安全配置
防止暴力攻击
php
<?php
// 限制登录尝试
function check_login_attempts($user, $username, $password) {
if (isset($_POST['pwd'])) {
$transient_name = 'login_attempts_' . $_SERVER['REMOTE_ADDR'];
$attempts = get_transient($transient_name);
if ($attempts >= 5) {
return new WP_Error(
'too_many_attempts',
'<strong>错误</strong>: 您已超过登录尝试次数,请 %d 分钟后重试。',
array(15)
);
}
$attempts++;
set_transient($transient_name, $attempts, 15 * 60);
}
return $user;
}
add_filter('authenticate', 'check_login_attempts', 30, 3);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
文件权限
bash
# 目录权限 - 755 或 750
find /var/www/html -type d -exec chmod 755 {} \;
# 文件权限 - 644 或 640
find /var/www/html -type f -exec chmod 644 {} \;
# wp-config.php 权限 - 400
chmod 400 /var/www/html/wp-config.php
# .htaccess 权限 - 644
chmod 644 /var/www/html/.htaccess
# uploads 目录 - 755
chmod 755 /var/www/html/wp-content/uploads1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Nginx 安全配置
nginx
# 禁用敏感文件访问
location ~ /\. {
deny all;
}
# 禁用 .htaccess 和 .htpasswd
location ~ /\.ht {
deny all;
}
# 禁用 wp-config.php 直接访问
location ~ ^/wp-config\.php$ {
deny all;
}
# 禁用 XML-RPC
location ~ /xmlrpc\.php$ {
deny all;
}
# 禁用列出目录
autoindex off;
# 启用 XSS 保护
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
📝 安全代码规范
数据验证
php
<?php
// 始终验证和清理数据
// 文本输入
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$url = esc_url_raw($_POST['url']);
$textarea = sanitize_textarea_field($_POST['content']);
// HTML 内容(受信任的内容)
$html = wp_kses_post($_POST['html_content']);
// 严格 HTML(允许的标签有限)
$restricted_html = wp_kses($_POST['content'], array(
'a' => array('href' => array()),
'br' => array(),
'em' => array(),
'strong' => array(),
));
// 数字
$id = absint($_GET['id']);
$count = (int)$_POST['count'];
// 浮点数
$price = floatval($_POST['price']);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
输出转义
php
<?php
// 始终转义输出
// 文本转义
echo esc_html($text);
echo esc_attr($class);
echo esc_url($url);
echo esc_js($js_string);
// HTML 转义
echo wp_kses_post($html);
// textarea 转义
echo esc_textarea($content);
// 允许的 URL
echo esc_url_raw($url);
// 音频/视频
echo esc_html($audio);
echo esc_html($video);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL 注入防护
php
<?php
// 使用准备语句
// ❌ 不安全
$results = $wpdb->get_results(
"SELECT * FROM {$wpdb->prefix}posts WHERE post_author = $author_id"
);
// ✅ 安全
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}posts WHERE post_author = %d",
$author_id
)
);
// 字符串参数
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}posts WHERE post_title = %s",
$title
)
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
🛡️ 安全插件推荐
| 插件 | 功能 |
|---|---|
| Wordfence | 防火墙、恶意软件扫描、登录安全 |
| Sucuri Security | 安全审计、文件完整性监控 |
| iThemes Security | 全面安全保护 |
| WPS Hide Login | 隐藏登录页面 |
| Two Factor | 双因素认证 |
🚨 应急响应
网站被黑怎么办?
- 保持冷静 - 不要急于恢复
- 断开网络 - 隔离被感染网站
- 评估损失 - 确定被入侵范围
- 备份证据 - 记录日志和修改
- 清理恶意代码 - 移除所有恶意内容
- 更新所有密码 - 包括数据库、FTP、主机
- 恢复干净备份 - 从未感染的最新备份
- 加强安全 - 修复漏洞
- 重新上线 - 监控系统
常用检测命令
bash
# 检测恶意代码
grep -r "base64_decode" /var/www/html/wp-content/
grep -r "eval(" /var/www/html/wp-content/
find /var/www/html -name "*.php" -exec grep -l "shell_exec" {} \;
# 检测可疑文件
find /var/www/html -name "*.php" -mtime -1
find /var/www/html -name "*.php" -size +1M
# 检测隐藏文件
find /var/www/html -name ".*" -type f1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
