上个月我一个客户的WP站凌晨三点被挂马,首页变成了菲律宾菠菜广告页。谷歌当天就标记为恶意网站,Chrome打开直接红色警告屏,日流量从5000多跌到两位数。查日志发现攻击者就是通过一个半年没更新的插件进来的——那个插件4月份就爆了RCE漏洞,补丁出了三个月他一直没更新。
说实话,WP被黑这事2026年比前几年更离谱了。AI写的攻击脚本现在满GitHub都是,连不懂代码的人都能用Claude生成一个自动扫描WP漏洞的工具。Wordfence 2026年6月报告显示,插件漏洞利用尝试同比增长了240%,而且攻击自动化程度高到吓人——从扫描到入侵平均只要47秒。
下面这15条是我自己维护七八个站点这几年踩出来的安全清单。每一条都有具体命令或配置,别光收藏,挑几条今天就做。
1. 换个强壮的管理员用户名
还在用admin?那你等于把大门钥匙放门垫下面。2026年暴力破解工具第一波尝试的用户名就是admin、administrator、root、test这几个。
如果你已经用admin建站了,别直接在后台改——WP不支持。进phpMyAdmin或者用WP-CLI:
wp user update 1 --user_login=新用户名 --display_name=新显示名
如果还没建站,安装时就把用户名设成非admin。再加一条:别用域名当用户名,比如wangchenyu这样就太明显了。
2. 强密码+双因素认证(2FA)
密码至少要16位,包含大小写+数字+特殊符号。但我实话跟你说,密码再强,撞库和社工还是能破。必须上2FA。
推荐Wordfence Login Security插件(免费,跟Wordfence防火墙同一个开发商)。它支持TOTP(就是Google Authenticator那种6位动态码),还能用生物识别在手机上验证。打开之后设置→Login Security→启用,扫二维码就完事了。
还有一个2026年的新选择:Cloudflare Zero Trust的免费计划也支持给wp-login.php加一层身份认证,不需要装插件。登录Cloudflare Dashboard→Zero Trust→Applications→Add application,选Self-hosted,把wp-login.php路径配置进去,用GitHub或Google账号做身份源。连接拒绝在到达你服务器之前。
3. 限制登录尝试次数
这个跟第2条是组合拳。Wordfence自带这个功能:打开Wordfence→All Options→Brute Force Protection,把「登录失败次数上限」设成5,「封锁时间」设成30分钟。
如果你不想装Wordfence,也可以用纯nginx方案:
limit_req_zone $binary_remote_addr zone=wp_login:10m rate=3r/m;
然后在location块里:
limit_req zone=wp_login burst=5 nodelay;
这样同一个IP每分钟只能请求wp-login.php三次。
4. 修改数据库表前缀
默认是wp_,几乎所有SQL注入自动化工具第一步都是查wp_users表。改成随机6位字符,比如x7k3m2_。
如果是新站,安装时在wp-config.php里直接改:
$table_prefix = 'x7k3m2_';
如果已经在跑的站,用Brozzme DB Prefix插件帮你改——它会自动更新所有表名和引用。改之前一定先备份数据库。
5. 保护wp-config.php
这个文件里有数据库密码、盐键(salts)、表前缀,是整个站最敏感的配置文件。在nginx里加一条规则禁止直接访问:
location ~* /wp-config.php { deny all; }
另外把文件权限设成400或440:
chmod 400 wp-config.php
再进一步,把wp-config.php从网站根目录往上移一层。WP会自动去父目录找这个文件。
6. 禁用XML-RPC
XML-RPC是WP最古老的API接口之一,主要给远程发布和pingback用的。问题是它几乎没有速率限制,攻击者可以通过xmlrpc.php用一次请求尝试几百个密码组合。2026年xmlrpc.php仍然是第三大攻击目标(仅次于wp-login.php和插件漏洞)。
如果你不用Jetpack或WordPress手机App发布文章,直接禁掉:
location = /xmlrpc.php { deny all; }
或者用Disable XML-RPC插件,一行代码都不用写。
7. 隐藏WordPress版本号
WP默认会在页面head里输出meta generator标签,直接暴露版本号。攻击者扫描到旧版本就能精准利用已知漏洞。
在主题functions.php里加:
remove_action('wp_head', 'wp_generator');
如果你用的是nginx,再加一条安全头把版本信息从响应中抹掉:
server_tokens off;
8. 禁用文件编辑器
WP后台自带主题和插件编辑器,管理员可以直接编辑PHP文件。攻击者一旦拿到管理员权限,就能用它写入webshell。
在wp-config.php里加一行:
define('DISALLOW_FILE_EDIT', true);
同样建议加上禁用插件和主题的安装更新(如果你用Git部署的话):
define('DISALLOW_FILE_MODS', true);
9. 限制uploads目录的PHP执行
2026年有一种很常见的攻击路径:攻击者通过某个允许上传的插件或主题漏洞,把一个.php文件伪装成.jpg上传到uploads目录,然后直接访问执行。
在nginx配置里给uploads目录加一条规则:
location ~* /wp-content/uploads/.*.php$ { deny all; }
或者在uploads目录下放一个.htaccess文件(Apache):
<FilesMatch ".php$">deny from all</FilesMatch>
如果你用宝塔面板,在网站设置→配置文件里找到uploads对应的location块加上面那条nginx规则就行。
10. 设置正确的文件权限
太多站长把所有文件权限都设成777就完事了,这等于给攻击者送了写入权限。
标准安全权限方案:
目录统一755:find /path/to/wp -type d -exec chmod 755 {} \;
文件统一644:find /path/to/wp -type f -exec chmod 644 {} \;
然后单独把wp-config.php锁死:chmod 400 wp-config.php
uploads目录需要写入权限(775),因为WP要通过PHP上传图片。但最好把PHP的执行者设为文件所有者而非www-data用户,这样文件权限644就够了。
11. 上WAF(Web应用防火墙)
如果你用Cloudflare,免费计划就自带基础WAF。进Security→WAF→创建规则,把SQLi和XSS威胁分设成Block。
同时在服务器层面推荐Wordfence或NinjaFirewall。Wordfence的防火墙在2026年有个新的实时恶意IP黑名单功能(需要付费版),能从全球几百万个Wordfence安装点收集攻击数据,一个站被打了所有站同步封IP。
不喜欢装插件的话可以用ModSecurity+OWASP规则集,但这需要一定运维基础。
12. 自动更新+备份双保险
WP默认只自动更新小版本(比如6.7→6.7.1),大版本需要手动更新。在wp-config.php里打开全部自动更新:
define('WP_AUTO_UPDATE_CORE', true);
插件也开自动更新。但注意:自动更新可能导致不兼容,所以更新前必须有备份。
我目前用UpdraftPlus每天凌晨自动备份到远程存储(七牛云/阿里云OSS/Backblaze B2都行),保留最近7天的备份。别把备份存在同一台服务器上——攻击者经常顺手删备份。
13. 修改默认登录地址
默认/wp-admin和/wp-login.php是全球攻击流量最集中的两个URL。改成自定义路径能直接过滤掉90%以上的自动化攻击。
用WPS Hide Login插件,把登录地址改成比如/my-secret-panel或者一个你容易记但别人猜不到的路径。注意不要跟别的插件slug冲突。
改完后记得加一条nginx规则把/wp-admin重定向到404,不然攻击者还是能扫到你用了WP:
location ~* /wp-admin$ { return 404; }
14. 监控文件完整性+异常活动
Wordfence自带文件完整性扫描,它会对比WP官方仓库里的核心文件哈希值和当前文件,发现被篡改就报警。建议设置每天凌晨自动扫描一次。
另外推荐WP Activity Log插件,记录每一次登录、插件激活、用户创建、文件修改等操作。被黑之后这是最宝贵的线索来源。
2026年新出的Solid Security(就是以前的iThemes Security改名换架构后的版本)也把文件变更检测做进了免费版,比Wordfence的这个功能轻量不少。
15. 禁用不需要的REST API端点
WP REST API默认暴露用户名列表(访问/wp-json/wp/v2/users就能看到所有作者的用户名),相当于把一半登录凭据送给了攻击者。
在functions.php里加:
add_filter('rest_endpoints', function($endpoints) { if (isset($endpoints['/wp/v2/users'])) { unset($endpoints['/wp/v2/users']); } return $endpoints; });
更彻底的办法是用Disable REST API插件,只保留自己需要的端点。
如果只能做5条,先做这些
时间有限的话按这个优先级来:
第一优先级(今天必须做):第1条(改admin用户名)+第2条(强密码+2FA)+第3条(限制登录尝试)。这三条组合拳能挡住95%的暴力破解攻击。
第二优先级(本周内做完):第11条(WAF)+第12条(自动更新+备份)。WAF堵漏洞,备份兜底。
剩下10条做了加分,不做也不是天会塌。但前5条是底线。
最后说一句:安全这事没有一劳永逸,你今天加固完,明天可能就有新的0day出来。养成每周登录后台看一眼更新通知、每月查一次Wordfence扫描报告的习惯,比任何清单都管用。
还木有评论哦,快来抢沙发吧~