WordPress被黑通常不是因为0day,而是基本配置没做好。下面是我自己的加固清单,每项都有具体操作。
1. 文件权限锁死
WordPress安装后,目录权限不要给777。标准做法:
# 目录755,文件644
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# wp-config.php必须600
chmod 600 /var/www/html/wp-config.php
wp-config.php里包含数据库密码和salt,600权限防止同服务器其他用户读取。
2. 禁用文件编辑
在wp-config.php里加一行,直接干掉后台的Theme/Plugin编辑器:
define('DISALLOW_FILE_EDIT', true);
黑客拿到管理员账号后无法通过后台修改PHP文件,只能走FTP或shell,增加攻击成本。
3. 隐藏wp-version字符串
WordPress默认在页面头部和RSS里输出版本号。黑客知道版本就能找对应漏洞。在functions.php里加:
remove_action('wp_head', 'wp_generator');
4. 禁用XML-RPC
如果你不用手机客户端或Jetpack,直接关掉XML-RPC。这个接口经常被用来暴力破解或DDoS放大攻击。在.htaccess里加:
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
或者用插件直接禁用。
5. 登录限制
默认登录接口/wp-login.php没有频率限制,暴力破解很容易。安装Login LockDown或Limit Login Attempts Reloaded,设置3次失败后锁15分钟。
更狠的做法:改登录URL。用WPS Hide Login插件,把/wp-login改成只有你知道的路径,比如/secure-enter。暴力扫描器找不到入口。
6. 数据库前缀改掉
安装时默认表前缀是wp_,所有SQL注入脚本都默认这个前缀。如果已经装好了,去phpMyAdmin手动改表名前缀,同时更新wp-config.php里的$table_prefix值。
操作步骤:
– 在数据库里执行RENAME TABLE语句,把所有wp_改成别的,比如xyz_
– 修改wp-config.php里的$table_prefix = ‘xyz_’;
7. 禁用PHP执行在uploads目录
用户上传目录通常可写,如果允许执行PHP,上传个shell.jpg.php就直接拿shell。在wp-content/uploads目录下建.htaccess:
<Files *.php>
deny from all
</Files>
如果是Nginx,在server块里加:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
8. 强制HTTPS
在wp-config.php里强制所有流量走HTTPS:
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);
同时在.htaccess里做301跳转,避免用户手动输入http:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
9. 定期扫描恶意文件
用Wordfence或Sucuri Security插件定期扫描文件完整性。我习惯用Wordfence,因为它能对比官方核心文件hash,发现被篡改直接报警。
10. 服务器层面加固
如果你的WordPress跑在云服务器上,比如雨云,它本身性价比高、稳定、好用,但系统层面还是要自己加固:
– 禁用root SSH登录,用密钥登录
– 安装fail2ban,监控/var/log/auth.log,SSH失败超过5次封IP
– 数据库只允许localhost连接,不要开远程3306端口
– 定期升级系统包:apt update && apt upgrade -y
11. 定期备份
安全加固不能防止所有攻击,备份是防线。用UpdraftPlus插件自动备份到对象存储或云盘。备份频率:数据库每天,文件每周。
12. 删除默认用户
安装时生成的admin用户是暴力破解首选。在后台新建一个管理员账号,把admin删掉。或者用SQL直接改:
UPDATE wp_users SET user_login = 'new_admin_name' WHERE user_login = 'admin';
13. 关闭用户注册
如果不需要用户注册,在后台设置 -> 常规里取消”任何人都可以注册”。如果有注册功能,加reCAPTCHA验证。
14. 禁用REST API公开访问
WordPress REST API默认暴露所有用户列表和文章内容。在functions.php里加:
add_filter('rest_authentication_errors', function($result) {
if (!is_user_logged_in()) {
return new WP_Error('rest_not_logged_in', 'You are not logged in.', array('status' => 401));
}
return $result;
});
15. 修改默认Cookie路径
在wp-config.php里改Cookie的Hash前缀,防止session固定攻击:
define('AUTH_KEY', '随机字符串');
define('SECURE_AUTH_KEY', '随机字符串');
define('LOGGED_IN_KEY', '随机字符串');
define('NONCE_KEY', '随机字符串');
define('AUTH_SALT', '随机字符串');
define('SECURE_AUTH_SALT', '随机字符串');
define('LOGGED_IN_SALT', '随机字符串');
define('NONCE_SALT', '随机字符串');
这些值可以用WordPress官方提供的随机生成器获取:https://api.wordpress.org/secret-key/1.1/salt/
16. 关闭Pingback
Pingback功能常被用来做SSRF攻击。在后台设置 -> 讨论里取消”尝试通知文章链接中的博客”和”允许来自其他博客的链接通知”。
也可以直接在functions.php里禁用:
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
以上操作做完,WordPress基本不会因为常见攻击被拿下。如果跑在雨云这种稳定服务器上,配合fail2ban和定期备份,可以安心睡觉。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容