信科网络 · 11 年只做 WordPress | 建站 / 主题 / 插件 / 商城 / 迁移 / 托管 | 累计服务 3000+ 企业 | 源码全交付
服务热线:13280692153 邮箱:web@wordpressx.com
工作日 08:30-18:0013280692153 免费诊断
首页/WordPress 教程/WordPress 安全加固:木马清理、防护插件与 wp-json
BLOG

WordPress 安全加固:木马清理、防护插件与 wp-json

分类 发布 2026-10-10

WordPress 被挂马很少是因为核心有漏洞,八成是从插件、主题、弱口令这三个口子进来的。发现的时候通常已经晚了:首页被人加了隐藏链接,搜索结果点进去跳到别的站,服务器 CPU 长期 100%,或者后台多了一个不认识的管理员账号。

被挂马后的六步清理顺序:隔离、找入口、清文件、查计划任务、换密钥、补洞
被挂马后的六步清理顺序:隔离、找入口、清文件、查计划任务、换密钥、补洞

先确认是不是真被挂马

别急着删文件,先取证。整站打包一份放到本地,包括数据库导出,后面比对和追查都要用。然后在服务器上跑一次关键词扫描,这一步能捞出大部分一句话木马。

grep -rn --include=*.php -E "eval(|base64_decode(|gzinflate(|str_rot13(|assert(" 
/www/wwwroot/example.com/wp-content/ | head -50

正常的 WordPress 代码里,这几个函数极少出现在 wp-content 目录。命中之后不要直接删,先看文件路径和修改时间,ls -l --time-style=full-iso 能看出来它是哪天被写进去的,那个时间点附近的访问日志就是入口线索。

另一种情况是代码干净但页面被注入。检查主题的 header.php 和 footer.php 有没有陌生的 <script>,以及数据库 wp_options 表里 wp_head 这类钩子有没有被塞进外链。用 SELECT option_name, LEFT(option_value, 200) FROM wp_options WHERE option_value LIKE '%<script%'; 能快速筛一遍。

木马一般藏在这四个地方

位置 典型形态 特征 处理
wp-content/uploads/ 伪装成图片的 .php,如 2024/05/logo.php 目录里出现 php 文件 整目录排查,禁止 uploads 执行 PHP
主题 functions.php 文件末尾一段被混淆的代码 打开是一片 x64x65... 用官方原版覆盖,别手工删
wp-includes/ 核心文件 多出 wp-tmp.php、class-wp-cache.php 之类的假文件 文件名像核心但不认识 下载同版本官方包,整目录覆盖
.htaccess / wp-config.php 插入 auto_prepend_file 或一行 require 首行被改写 手工对比,恢复干净版本

uploads 目录最容易被忽略,因为大家默认那里只放图片。攻击者上传一个 shell.php 再改成 shell.jpg.php,只要 Nginx 把 .php 交给 PHP 处理,就能直接执行。这条要在 Nginx 层面堵死,具体配置后面讲。

清理顺序:断入口、换文件、再观察

顺序错了会反复中招。有人删完木马第二天又被挂,原因就是入口没断,密码没换。

  1. 先备份现状,包括日志。清理动作会破坏证据。
  2. 断入口:后台把所有管理员密码重置一遍,把不认识的账号降级或删除;数据库密码、FTP 密码、面板密码全部改掉;如果装了 xmlrpc.php 相关的爆破入口,直接关掉。
  3. 覆盖核心:下载同版本官方安装包,把 wp-admin/ 和 wp-includes/ 整个目录替换掉。这两个目录里的文件不应该有任何自定义修改,覆盖是安全的。
  4. 重装主题和插件:不要试图从被感染的文件里”清掉那一段”,直接删目录重新安装。主题目录里如果有自己改过的代码,先比对再决定。
  5. 清 uploads 里的可执行文件:find /www/wwwroot/example.com/wp-content/uploads -name "*.php" -type f,正常情况下应该一条都没有。
  6. 检查 .htaccess、wp-config.php、index.php 的首尾几行,以及 wp_options 里的可疑 option。
  7. 把核心、主题、插件全部更新到当前版本。停更两年以上的插件直接卸载,这类代码是扫描器最爱找的目标。
  8. 换密钥(下面单独讲)。
  9. 全站再扫一遍,确认 grep 无命中,然后观察三到七天访问日志,看有没有回连或者再次写入。

换密钥:让所有登录状态立即失效

wp-config.php 里有八个密钥常量,从 AUTH_KEY 到 NONCE_SALT。它们参与登录 cookie 的签名,换掉之后所有已登录会话立刻失效——包括攻击者留在后台的那个会话。这是清理流程里最容易被跳过、也最有效的一步。

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

八个值不要自己随手敲,用 WordPress 官方的密钥生成接口,或者本地生成:openssl rand -base64 48 跑八次。不要把同一串值复制到八个常量里,盐值重复会削弱签名强度。换完所有人(包括你自己)都要重新登录,这是正常现象。

顺便把数据库用户也换掉。很多人一直用 root 连数据库,这在被入侵后等于把整个实例交出去。新建一个只对当前库有增删改查权限的用户,写进 wp-config.php 的 DB_USER 和 DB_PASSWORD。

wp-json 暴露的用户名,是撞库的起点

WordPress 默认开放 REST API,访问 /wp-json/wp/v2/users 会返回所有发过文章的用户,包含 id、name、slug。攻击者拿这个列表去撞密码,比盲猜效率高得多。这不是漏洞,是设计如此,但对外网开放的站点没必要留着。

处理方式有两种,按站点情况选。装了 WooCommerce、用了区块编辑器、有 APP 对接的站,不能整体禁用 REST API,只关掉 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;
});

纯展示站、没有前后端分离的,可以在 Nginx 层直接挡:

location ~* ^/wp-json/wp/v2/users {
    return 403;
}

两种方式都要注意一点:返回 403 而不是 404,攻击者仍然能判断端点存在,但至少拿不到用户列表。想更彻底就返回 404。改完用浏览器直接访问验证一次,别只看代码。相关思路在安全插件里也有对应开关,插件和 Nginx 二选一,别叠加。

后台地址和文件权限

后台是爆破的主要目标。/wp-login.php 和 /wp-admin/ 这两个地址全网都知道,改路径比加验证码有效。改路径用插件把登录地址换成自定义 slug,同时保留一个 404 兜底;或者更简单,在 Nginx 上给登录页加一层 Basic Auth,攻击者连表单都看不到。

location = /wp-login.php {
    auth_basic "Restricted";
    auth_basic_user_file /www/server/pass/wp-login.pass;
    include fastcgi_params;
    fastcgi_pass unix:/tmp/php-cgi-74.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

文件权限按下面的标准设,属主统一是运行 PHP 的用户(宝塔下是 www):

防护插件用不用,取决于你有没有人盯着日志。Wordfence、Sucuri 这类插件能拦暴力破解、比对核心文件完整性、扫描已知恶意代码,缺点是占资源、误报不少,装上之后要花时间调规则。小站装一个当作提醒,大站更应该把规则写在 Nginx 和 WAF 上,性能开销小,拦截也更靠前。别同时装两个安全插件,它们会争抢同一批钩子,扫描结果还会互相打架。

对象 权限 说明
目录 755 不要给 777,任何进程都能写入
普通文件 644 PHP 文件不需要执行位
wp-config.php 600 或 640 只有属主可读,里面是数据库口令
wp-content/uploads 755 需要可写,但禁止执行 PHP

禁止 uploads 执行 PHP 的规则写在 Nginx 的 server 块里,这条比任何插件都硬:

location ~* ^/wp-content/uploads/.*.(php|phtml|php5|php7)$ {
    deny all;
}

备份是最后一道防线

前面所有手段都可能失效,只有一份能用的备份是确定的。做法是数据库每天一次、文件每周一次,保留至少三十天,并且存到站外——被入侵的服务器上的备份,攻击者一样能删。备份文件不要放在 /wp-content/backup/ 这种可猜到的路径,用对象存储或者另一台机器。

更重要的是演练。备份有没有用,只有还原过一次才知道。很多人第一次还原是在真出事的时候,结果发现备份是空的、或者少了一张表。建议每季度在测试环境还原一次,跑一遍首页、后台、搜索,确认可用。备份策略和还原步骤见备份恢复,被黑之后的完整处置流程在被黑修复,边界防护的配置思路在防火墙,整体加固清单在安全加固。

INDUSTRIAL BELT

扎根中国制造产业带
懂工厂,才懂出海

从胶东半岛到珠三角,从长三角到中原腹地,每一片产业集群都有自己的出口节奏与买家画像。信科网络长期扎根产业一线,把工厂的产品语言翻译成海外采购商听得懂的搜索语言,让每一分投入都对着真实的询盘去。

yuanzhou

原州外贸网站建设

原州区,隶属于宁夏回族自治区固原市,地处宁夏南部,六盘山东北麓,黄土高原中西部,东邻彭阳县,南接泾源县,西连西吉县,北靠海原县、同心县,东北、西南分别与甘肃环县、隆德县毗壤,是固…

qianjiang

黔江外贸网站建设

重庆市黔江区位于重庆市的东南边缘,地处武陵山腹地,东临湖北省的咸丰县,西界彭水县,南连酉阳县,北接湖北利川市,是渝、鄂、湘、黔四省市的结合部,素有”渝鄂咽喉”之称。另外…

xixia

西夏外贸建站

西夏区是宁夏回族自治区银川市的一个市辖区,位于银川市西部,地理坐标东经105°49′~106°18′,北纬38°08′~38°52′。西夏区东起包兰铁路,西至贺兰山口轴线(宁蒙界),南临永宁县,北接贺兰县,…

huanghua

黄骅外贸建站

概况:黄骅市位于北纬38°09′-38°39’,东经117°05′-117°49’之间。处于“环渤海、环京津”的“双环”枢纽地带和东北来经济圈的中心位置,是国家跨世纪工程–神华工程的…

kaizhou

开州WordPress建站

开州区隶属于重庆市,位于重庆市东北部,三峡库区小江支流回水末端,介于北纬30°49′30″-31°41′30″、东经107°55′48″-108°54′之间,西邻四川省开江县,北依大巴山接城口县和四川省宣汉县,东毗云…

hongsibao

红寺堡WordPress建站

宁夏吴忠市红寺堡区前身为红寺堡开发区,是宁夏回族自治区吴忠市第二个市辖区。它是国家大型水利枢纽工程——宁夏扶贫扬黄灌溉工程(“1236”工程)的主战场,是全国最大的生态扶贫移民集中区,200…

dianjiang

垫江Shopify建站

垫江,地处重庆市中部,“上接巴渝之雄,下引蘷巫之胜”,占据渝北咽喉,区位优势突出。幅员面积1518平方公里,总人口85万人。历史悠久,文化昌达。自西魏恭帝2年(公元555年)置县至今1400多年…

xiongxian

雄县Shopify建站

河北省保定市雄县位于东经116°06',北纬38°59'。平均海拔10米。处于冀中平原的京、津、保三角腹地,南倚“华北明珠”白洋淀,北靠“京南小香港”___白…

litong

利通外贸推广

利通区隶属于宁夏自治区吴忠市,地处中国西北内陆,位于宁夏平原中部,距首府银川市59千米,是宁夏经济发展的核心区之一,也是吴忠市政治、经济、文化中心。辖区总面积1384平方千米,辖8镇4乡…

pengyang

彭阳外贸推广

彭阳县位于宁夏回族自治区,位于宁夏回族自治区南部边缘,六盘山东麓,介于东经106°32′-106°58’之间,北纬35°4l’-36°17’。西连宁夏固原市原州区,东、南、北环临甘肃…

xiushan

秀山Google SEO

秀山土家族苗族自治县,位于重庆市东南部,武陵山脉中段,四川盆地东南缘的外侧,为川东南重门户。与湖南省、湖北省、贵州省毗邻,326国道和319国道贯穿全县。距长沙604公里、武汉656里、贵阳5…

shenzhou

深州Google SEO

深州市旧称深州,上古为冀州大陆之域。春秋时为晋地。战国属赵。秦属钜鹿郡。汉为下博县。隋开皇十六年(公元五九六年),于安平置深州,以城西故深池得名。尔后迭经废置,州城屡迁。唐徙州治…

tongnan

潼南GEO优化

潼南县位于重庆市西北部最前沿。是川渝握手区腹地东西南北交通自然便捷走向的交汇点及区域几何中心,是成渝经济区的腹地中心,是重庆西部凸入川中腹地最远、毗邻四川县市最多的对外开放最前沿…

hengshui

衡水GEO优化

衡水市位于河北省东南部,东与沧州市和山东省德州市毗邻,西与石家庄市接壤,南与邢台市相连,北与保定市交界;南北长125.5公里,东西宽98.13公里,全市辖8县2市1区,总面积5815.4平方公里。衡…

banan

巴南谷歌SEM

巴南区的前身是千年历史名邑巴县。早在3000多年前的商代,巴人就在此繁衍生息,立国建都。秦代置巴郡,南朝齐代置垫江县,北周时改称巴县并沿袭至1995年。1995年经国务院批准撤县建区,成立巴…

haiyuan

海原谷歌SEM

位于中国宁夏回族自治区中南部。1991年底人口31.15万。回族为主,有汉、满、蒙古、东乡等民族。西汉属安定郡。清同治十三年(1874)设海城县。民国三年(1914)改海原县。地形复杂,多山地。年…

liangping

梁平Facebook广告

梁平县,原名梁山县,位于重庆市东北部,东邻万州区,西连四川省大竹县,南靠忠县、垫江县,北接四川省达州市达县、开江县。”。  

fuling

涪陵Facebook广告

重庆市涪陵区,邑枕长、乌两江,素为乌江流域物资集散地,有渝东南门户之称,是闻名遐迩的中国“榨菜之乡”。全区幅员面积2946平方公里,辖1个经济技术开发区、1个私营经济示范区和44个乡镇、街…

fengjie

奉节Yandex推广

奉节县位于重庆市东部,地处四川盆地东端,地理坐标为东经109°1′17″—109°45′58″,北纬30°29′19″—31°22′33″。县境东邻巫山县,南界湖北省恩施土家族苗族自治州,西连云阳县,北接巫溪县。境内有…

xianxian

献县Yandex推广

献县历史悠久,夏商时期属冀州,春秋时属燕国,战国时属燕、赵、秦。早在春秋战国时期。境内就形成了具有一定影响力的城市——乐成。汉高祖六年(公元前201年)置河间郡,汉文帝二年…

rongcheng

容城TikTok推广

河北省容城县,历史悠久,距今已有2000年的历史,全县总面积314平方公里,总人口25万人。地理位置得天独厚。位于河北省中部,京、津、保腹地,距首都北京和天津直辖市均为120公里,两个小时的…

为什么一定要选懂产业带的出海服务商?建材丝网的欧洲建筑商看资质与交期,工业橡塑的中东工程商问耐温与工况,毛皮服饰的俄罗斯分销商算的是季节与毛利。买家不同,决策逻辑就不同;信科网络把这些差异拆进网站结构、关键词地图和投放策略里,用他们习惯的方式出现在他们搜索的地方。