又被WPScan扒了底裤?这套Nginx+functions.php组合拳把后台焊死

先说个扎心的数据——2025年NVD收录的WordPress相关CVE超过3200个,其中87%来自第三方插件。核心团队安全响应是跟得上的,但插件生态那帮作者,停更的停更、跑路的跑路,你装个三年没更新的联系表单插件,等于给黑客开后门。所以防黑这事儿,不能全指望插件,得在Nginx层就把脏请求挡掉,连PHP都不让它碰。
WordPress安全加固示意
第一招,把wp-login.php焊死在IP白名单里。编辑站点的Nginx配置,加上这段:

# 只允许自己IP访问后台登录页,别人全扔403
location = /wp-login.php {
    allow 203.0.113.0/24;   # 换成你家或办公室的IP段,别傻乎乎用我写的这个
    deny all;
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# uploads目录禁止执行PHP,这条能挡住90%的上传木马
location ~* /uploads/.*\.php$ {
    deny all;
    return 403;
}
# 敏感文件直接屏蔽,readme和xmlrpc都是信息泄露重灾区
location ~* /(wp-config\.php|readme\.html|license\.txt|xmlrpc\.php) {
    deny all;
    return 403;
}

这段配置的精髓在于——请求在Nginx层就被403了,根本不会往后走到PHP,性能和安全性双赢。很多人只装个安全插件就完事,但插件得等WordPress加载完才生效,每次请求照样吃服务器资源,治标不治本。
如果你IP老变(比如家宽拨号),白名单玩不转,那就上频率限制,配合Limit Login Attempts Reloaded插件吃双层buff:

# 登录接口限速,每秒1个请求,突发最多3个
location /wp-login.php {
    limit_req zone=login burst=3 nodelay;
    limit_req_status 429;
}

记得在http块里先定义zone:limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
第二招,functions.php里把那些个暴露信息的玩意儿全干掉。xmlrpc.php这玩意儿现在除了给爆破工具当跳板,正经用途真不多:

// 干掉XML-RPC,WPScan的暴力破解就废了一半
add_filter('xmlrpc_enabled', '__return_false');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
// 隐藏WP版本号,别告诉人家你装的哪个有洞的版本
remove_action('wp_head', 'wp_generator');
function kill_wp_version_in_src($src) {
    if (strpos($src, '?ver=')) {
        $src = remove_query_arg('ver', $src);
    }
    return $src;
}
add_filter('style_loader_src', 'kill_wp_version_in_src', 9999);
add_filter('script_loader_src', 'kill_wp_version_in_src', 9999);

第三招,wp-config.php里禁用后台文件编辑器。这玩意儿是真·双刃剑,黑客拿到admin权限就能直接改你主题源码插马,防不胜防:

// 这行加上,后台的主题/插件编辑器直接灰掉
define('DISALLOW_FILE_EDIT', true);
// 这个保持false,不然你连插件都装不了
define('DISALLOW_FILE_MODS', false);

资源链接

posted @ 2026-06-26 10:54  荒野孤灯0813  阅读(11)  评论(0)    收藏  举报