安全指南
如何检查网站或服务器是否被入侵:共享主机、WordPress 和 VPS 的逐步检查,以及发现问题后最先做什么
按环境检查自己的网站或服务器是否被入侵:共享主机、WordPress、Linux VPS 和 Google Search Console。管理员用户、wp core verify-checksums、登录记录、authorized_keys、cron 和监听端口,以及发现问题后的应对顺序。
对象:在共享主机、WordPress 或 VPS 上运营网站的个人和小型企业,现在正担心「我是不是被黑了」。本指南带你自己检查自己的网站和服务器。内容依据 WordPress.org、WP-CLI、Google 搜索中心的官方文档、各命令的手册页、日本 IPA 和 JPCERT/CC 的资料以及 GDPR。不涉及攻击手法。
如果现在就觉得不对劲,先只做这一件事
在删除或覆盖任何网站文件之前,先把日志和整个网站(文件和数据库)复制一份。这些一旦没了,就再也查不出攻击者是从哪里进来的。修改密码时,请使用另一台已经用杀毒软件扫描过的干净设备。
应该怀疑被入侵的迹象
符合以下任意一条,就继续进行下文按环境的检查。WordPress.org 的「FAQ My site was hacked」也列出了被黑的明显迹象,包括被搜索引擎列入黑名单、主机商停用网站,以及出现新用户被创建等未经授权的行为。
| 迹象 | 在哪里发现 |
|---|---|
| Search Console 显示安全问题,或 Google 发来邮件 | Google Search Console |
| 搜索结果显示「This site may be hacked」(此网站可能已遭到入侵) | Google 搜索 |
| 浏览器警告网站危险,或访问者的杀毒软件报警 | 访问者的反馈 |
| 主机商警告篡改、垃圾邮件或负载过高,或暂停了网站 | 主机商的邮件 |
| 出现你从没创建过的管理员用户 | WordPress 仪表盘 |
| 搜索结果中出现你从没创建过的页面(药品、名牌商品、大量日文页面) | site: 搜索 |
| 只在手机上、或只在从搜索进入时才跳转到其他网站 | 用手机检查 |
| 你的服务器在发送垃圾邮件,或达到发送上限 | 主机商通知、退信 |
| CPU 或流量无故激增 | 服务器的监控 |
「在我电脑上看着没问题」证明不了什么
Google(web.dev)解释说,有些被黑的网站会对不同类型的用户显示不同内容(cloaking,伪装):你打开页面时它可能是空白的,而 Google 看到的却是垃圾关键词和链接。Google 搜索中心的一篇博客文章也指出,被黑的网站可能只把移动用户跳转到垃圾域名,并建议用智能手机从 Google 搜索结果打开自己的网站进行检查。
按环境检查
检查与你的环境相符的行。如果你在共享主机上运行 WordPress,前两行都适用。
| 环境 | 查看哪里 | 要找什么 |
|---|---|---|
| 共享主机 | 控制面板中的访问日志和错误日志、文件管理器、邮件发送记录 | 对陌生网址的请求或大量 POST、最近被修改的文件、陌生的 .htaccess 或 PHP 文件、外发邮件激增 |
| WordPress | 仪表盘中的「All Users」和「Installed Plugins」、WP-CLI | 陌生的管理员、你没安装过的插件或主题、被修改的核心文件 |
| VPS(Linux) | SSH 日志、authorized_keys、cron、用户列表、监听端口、软件包校验 | 来自陌生来源的登录、陌生的公钥、陌生的定时任务、新用户、陌生的监听程序 |
| Google Search Console | 「Security issues」、「URL Inspection」工具、site: 搜索 | Google 发现的问题和示例网址,以及 Google 在页面上看到的内容 |
共享主机
即使没有 SSH,控制面板通常也能检查以下三点(名称因主机商而异)。
- 在文件管理器中打开公开目录,按修改日期排序。留意在你没动过的日子里被修改的文件、名字毫无意义的 PHP 文件,以及
uploads等图片目录中的 PHP 文件 - 下载访问日志和错误日志,查看对管理后台的请求(WordPress 的话是
/wp-login.php和/wp-admin/)来自哪里、发生在什么时候,以及对你不认识的网址的请求 - 如果能看到邮件发送数量或记录,查找你没发过的大量邮件
也要检查 .htaccess。WordPress.org 指出,无论感染类型如何,.htaccess 都是最常被修改和滥用的文件之一,并提到 index.php、header.php 和 footer.php 因为会影响每一次页面请求,是价值很高的目标。
WordPress
在仪表盘中检查两个地方。
- 「Users > All Users」(用户 > 所有用户):有没有你没创建过的「Administrator」(管理员)角色的用户?
- 「Plugins > Installed Plugins」(插件 > 已安装的插件):有没有你没安装过的插件?用同样的方法检查「Appearance > Themes」(外观 > 主题)
如果服务器上可以使用 WP-CLI(WordPress 官方的命令行工具),就可以自动把文件与官方发布版本进行比对。
# Check WordPress core files against WordPress.org checksums
wp core verify-checksums
# Also warn about non-WordPress files in the WordPress root directory
wp core verify-checksums --include-root
# Verify plugins distributed on WordPress.org
wp plugin verify-checksums --all
# List administrator accounts with their registration dates
wp user list --role=administrator结果正常时会输出 Success: WordPress installation verifies against checksums.。不一致的文件会输出 Warning: File doesn't verify against checksum:,后面跟着文件名。插件校验是与 WordPress.org 的校验和比对,所以付费插件和自定义主题无法用这种方法检查。对于这些,请从开发商那里重新下载同一版本进行比较。
VPS(Linux)
在 VPS 上,要查找入侵者为了再次进入而留下的东西:公钥、定时任务、新用户和监听连接的程序。以下命令全部在你自己的服务器上、以管理员身份运行。
# SSH login records (the unit is ssh on Debian/Ubuntu, sshd on RHEL-family)
sudo journalctl -u ssh --since "2026-10-01"
# Recent logins (on Debian 13, use wtmpdb last instead; install the wtmpdb and libpam-wtmpdb packages)
last -a
# Each user's last login (on Debian 13, use lastlog2 instead; install the lastlog2 and libpam-lastlog2 packages)
lastlog
# SSH public keys: the current user's (other users: /home/*/.ssh/authorized_keys) and root's
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
# Scheduled jobs (per user and system-wide)
crontab -l
sudo crontab -l -u root
sudo cat /etc/crontab
sudo ls -la /etc/cron.d
# Users, and the group with admin rights (wheel on RHEL-family)
getent passwd
getent group sudo
# Listening TCP ports and the programs behind them
sudo ss -tlnp
# Files in the web root whose contents changed in the last 7 days
sudo find /var/www -type f -mtime -7
# Have package files changed since they were installed?
sudo debsums -s # Debian/Ubuntu (needs the debsums package)
sudo rpm -Va # RHEL-family结果的看法:
- 在
journalctl的输出中,检查登录成功(Accepted)的来源 IP 里有没有不属于你的地址。如果什么都没显示,可能是单元名不同;用systemctl list-units --type=service确认 SSH 服务的名称 - 在
authorized_keys中,查找你从没添加过的公钥。如何管理能登录服务器的密钥,请看 SSH 密钥的最小权限 - 在 cron 中,查找从陌生网址下载并执行内容的行
- 在
ss的列表中,查找不是你启动的监听程序 debsums -s只报告有问题的文件;rpm -Va会用大小(S)、摘要(5)、修改时间(T)等代码标出被修改的文件
不要过度依赖日志和命令输出
find -mtime 看的是文件的修改时间,而修改时间是可以被改的。debsums 的手册本身也说,它作为安全工具的用处有限。日志在保存期限结束后就会消失。而且在 Debian 13 上,由于 2038 年问题,last、lastb 和 lastlog 已不再提供。每项检查都能为你提供入侵的证据,但什么都没找到并不能证明是干净的。
Google Search Console
如果你的网站还没有在 Search Console 中注册,请先添加并验证所有权。
- 在「Security issues」(安全问题)报告中查看有没有列出问题。问题大致分为三类:「Hacked content」(被黑内容)、「Malware and unwanted software」(恶意软件和垃圾软件)、「Social engineering」(社会工程),通常附有示例网址。有些问题没有示例网址;Google 说明这并不表示没有页面受到影响
- 在 Google 上搜索
site:你的域名,查找你从没创建过的页面。Google 说明,这会列出你网站的页面,包括黑客可能添加的页面 - 把可疑页面放进「URL Inspection」(网址检查)工具,查看 Google 是怎么看到它的
术语补充:像上面这样、已经发生的入侵留下的痕迹,称为 IOC(失陷指标)。请看 什么是 IOC;关于在攻击仍在进行时根据行为发现攻击,请看 什么是 IOA。
发现问题后最先做什么
顺序一旦搞错,要么毁掉证据,要么在攻击者的入口仍然敞开的情况下恢复网站。请从上往下进行。
1 — 控制
让网站下线,或挂出维护页面
2 — 保全证据
把日志、文件和数据库复制到服务器之外
3 — 更换所有凭据
仪表盘、FTP、SSH 密钥、数据库、API 密钥(从干净的设备操作)
4 — 回到干净的状态
从入侵前的备份恢复,或者重建
5 — 堵住入口
更新、删除不用的插件、查明原因
6 — 审核与报告
在 Search Console 申请审核;按要求报告数据泄露
控制:先让网站下线
为了不让访问者被投放恶意软件或诈骗页面,请让网站下线或显示维护页面。在 VPS 上,限制外部流量,同时保留调查所需的访问。在共享主机上,联系主机商的客服,商定如何下线以及他们那边会做什么。WordPress.org 也建议与主机商确认,因为在共享主机上,被黑的影响可能不止你的网站。
保全证据:先复制,再清理
WordPress.org 建议,即使环境已被感染,在开始清理之前也要再做一次快照。Google 同样建议在清理前把整个网站和数据库备份到服务器之外的位置。访问日志、错误日志和 SSH 日志会按计划被清除,所以要先把它们保存下来。备份要点 中的做法可以直接套用。
从干净的设备更换所有凭据
WordPress.org 要求你修改所有访问入口的密码——FTP/SFTP、WordPress 仪表盘、主机控制面板和 MySQL——而且要包括所有能访问该环境的用户,而不只是你自己。重新生成 wp-config.php 中的密钥(salt)也会让仍在登录的所有人退出。在 VPS 上,生成新的 SSH 密钥,并在 authorized_keys 中只保留你自己的。重新签发保存在 .env 等文件中的第三方 API 密钥。
WordPress.org 指出,攻击常常始于站长自己的电脑,并建议也扫描它。请在已扫描过的干净设备上进行修改,并开启 多因素认证。
回到干净的状态:入侵前的备份,或者重建
如果你有一份确定早于入侵的备份,就从它恢复。如果不知道攻击者是什么时候进来的,越新的备份越可能已被污染。WordPress 的话,用官方下载的同一版本替换 wp-admin 和 wp-includes,并从来源处重新获取 wp-content 中的主题和插件。在 root 可能已被攻破的 VPS 上,新建一台服务器、只迁移检查过的数据,比清理更可靠。
堵住入口,不让对方用同样的方法再进来
更新 WordPress 核心、插件和主题,删除所有不用的东西。常见原因是过时插件的漏洞、重复使用的密码,以及从公开目录泄露的配置文件。Google 警告,如果不修复让感染进来的漏洞,网站可能再次被感染。WordPress 的加固请看 WordPress 安全,配置文件该放在哪里请看 别把密钥放进公开目录。WordPress.org 还建议在网站清理干净后再修改一次密码。
审核与报告:Search Console,以及泄露的个人信息
如果 Search Console 列出了问题,请修复整个网站的所有问题,然后在「Security issues」报告中选择「Request Review」(申请审核)。在申请中说明问题、你所做的修复以及结果。Google 说明,审核需要几天到几周,受理和完成时都会发邮件通知你。在得出结论前重复提交,可能会延长审核时间。
如果联系表单提交内容或会员记录等个人信息可能已经泄露,请看下文「如果个人信息可能已经泄露」。
本站的看法:检查的目的不是宣布自己干净,而是判断还能信任到什么程度
小网站常见的错误是:找到一个可疑文件,删掉它,就当处理完了。但你找到的文件是入侵的结果,而不是入口。如果不堵住入口和攻击者留下的回来的路(公钥、管理员用户、定时任务),同样的事还会再发生。
所以我们建议,按「还能信任到什么程度」来判断你的发现。如果只是 WordPress 核心文件被修改,替换核心并更换凭据,很可能就能恢复。如果服务器的 root 可能已被拿下,它的日志和命令输出都不可信,请重建。尽早划清这条线,可以避免花了好几天清理,最后还是得重建。
如果个人信息可能已经泄露
如果你作为企业处理个人信息,而联系表单提交内容或会员记录可能已经泄露,请确认你运营所在地的规定。
- 欧盟和英国(GDPR 第 33 条):在知悉个人数据泄露后,应无不当延迟地、并在可行的情况下于 72 小时内通知监管机构,除非该泄露不太可能对个人的权利和自由造成风险。第 34 条规定了何时还必须告知受影响的个人
- 日本:个人信息保护委员会(PPC)列出了四类需要报告的情形——敏感信息、可能造成财产损失、怀疑出于不当目的,以及超过 1,000 人。非法访问造成的泄露被作为「不当目的」类的例子。初步报告须在发现后 3 至 5 天内提交,最终报告须在 30 天内(「不当目的」类为 60 天内)提交,并且还必须通知受影响的个人
- 其他地区:请确认本国数据保护机构的规定
可以求助的地方
| 对象 | 能做什么 |
|---|---|
| 你的主机商或 VPS 服务商 | 暂停网站、检查服务商侧的日志、调查对同一服务器的影响 |
| JPCERT/CC 事件响应委托(日本) | 受理一般公众的事件报告;对于被篡改的网站,会联系网站管理者请求修复。通过网页表单或邮件报告 |
| IPA 计算机病毒与非法访问申报(日本) | 受理非法访问造成的损害申报,也包括没有造成实际损害的未遂情形 |
| 你所在国家的 CERT 或数据保护机构 | 日本以外的事件报告和数据泄露通知 |
| WordPress.org 支持论坛 | 详细描述症状,向社区寻求帮助 |
出处(官方)
- WordPress.org:FAQ My site was hacked — wordpress.org
- WordPress.org:Administration Screens — wordpress.org
- WP-CLI:wp core verify-checksums — developer.wordpress.org
- WP-CLI:wp plugin verify-checksums — developer.wordpress.org
- WP-CLI:wp user list — developer.wordpress.org
- Google:Security issues report(Search Console 帮助)— support.google.com
- Google:How do I know if my site was hacked?(web.dev)— web.dev
- Google:Fix the cloaked keywords and links hack(web.dev)— web.dev
- Google 搜索中心博客:Detect and get rid of unwanted sneaky mobile redirects(2015 年 10 月)— developers.google.com
- Google 搜索帮助:Report a problem with Google Search(关于「This site may be hacked」标签)— support.google.com
- Debian 手册页:journalctl(1)、last(1)、lastlog(8)、sshd(8)、crontab(1)、cron(8)、ss(8)、find(1)、debsums(1) — manpages.debian.org
- RPM:rpm(8)(--verify 输出的读法)— rpm.org
- Debian 13(trixie)发行说明:last、lastb 和 lastlog 命令已被替换 — debian.org
- GDPR(Regulation (EU) 2016/679)第 33 条和第 34 条 — eur-lex.europa.eu
- 日本个人信息保护委员会:泄露等事态的报告与本人通知义务化(日文)— ppc.go.jp
- 日本个人信息保护委员会:发生泄露等事态时的应对(日文)— ppc.go.jp
- JPCERT/CC:事件响应委托(日文)— jpcert.or.jp
- IPA:计算机病毒与非法访问的申报(日文)— ipa.go.jp
接下来阅读
- 个人账户:如何检查账户是否被他人登录
- 主机商自身被入侵时:虚拟主机服务商被入侵时客户该做什么(为自己的设置无法防止的情况做准备,英文)
- 检查文件放在哪里:别把密钥放进公开目录 / 在共享主机上不让 .env 被公开
- WordPress:WordPress 安全——生产环境加固参考 / 常见的入口:文件上传漏洞(英文)
- 术语:什么是 IOC? / 什么是 IOA? / 什么是后门?(英文) / 什么是恶意软件?
- 恢复:备份要点
FAQ
Q怎样检查自己的网站是否被黑了?
先看 Google Search Console 的「Security issues」(安全问题)报告里有没有列出问题。然后在 Google 上搜索 site:你的域名,看有没有你从没创建过的页面。最后用智能手机从 Google 搜索结果打开你的网站,看是否会被跳转到别处。被黑的内容有时会刻意设计成:站长直接访问网站时看不到。
Q怎样检查 WordPress 网站是否被控制了?
在仪表盘中打开「Users > All Users」(用户 > 所有用户),查找你没有创建过的管理员;再打开「Plugins > Installed Plugins」(插件 > 已安装的插件),查找你没有安装过的插件。如果有 WP-CLI,wp core verify-checksums 可以把 WordPress 核心文件与官方发布版本进行比对。在 WordPress.org 上分发的插件,可以用 wp plugin verify-checksums --all 检查。
Q打开网站看起来一切正常,但搜索结果显示它可能被黑了。
可能使用了伪装(cloaking,对不同访问者显示不同内容)。被黑的页面有时只对搜索引擎、或者只对从搜索结果用手机进入的人显示垃圾内容或跳转。Google 说明,在站长于 Search Console 中修复安全问题并申请审核之前,这个标签会一直保留。请查看「Security issues」报告中的示例网址,并用「URL Inspection」(网址检查)工具查看 Google 看到的内容。
Q我用的是共享主机,没有 SSH,怎么检查?
用控制面板的文件管理器按修改日期排序文件,并下载访问日志和错误日志,查找对陌生网址的请求或对管理后台的登录。WordPress 的话,在仪表盘中检查用户和插件。如果拿不准,就联系主机商的客服。在共享主机上,服务商有时可以检查对整台服务器(包括其他客户)的影响。
Q如果什么都没找到,是不是就安全了?
不是。文件的时间戳可以被修改,日志在保存期限结束后就会消失,而在攻击者已取得 root 权限的服务器上,服务器自身命令的输出已经不可信。如果你有外部证据,例如 Search Console 的警告或主机商的通知,即使什么都没找到,也应按已被入侵处理,计划更换凭据并重建。
Q网站的个人信息可能泄露了,要向哪里报告?
取决于你在哪里运营。在日本,个人信息保护委员会把非法访问造成的数据泄露列为需要报告的例子之一:初步报告须在发现后 3 至 5 天内提交,最终报告须在 30 天内(怀疑出于不当目的时为 60 天内)提交。在欧盟和英国,GDPR 要求在可行的情况下于 72 小时内通知监管机构,除非该泄露不太可能对个人造成风险。请确认你所在国家的数据保护机构的规定。