泄露密钥扫描器
泄露密钥扫描器检查那些本不该公开的文件和凭据是否能被任何人从你的网站上取走:装着数据库密码的 .env 文件、会交出全部源代码历史的 .git 文件夹、遗留在 Web 根目录的备份压缩包,或者藏在 JavaScript 包里的真实 API 密钥。输入一个 URL,本扫描器会探测常见暴露路径、验证任何有响应的内容,并扫描页面及其脚本中的已知密钥模式——只显示打码后的值,绝不显示密钥本身。配套指南暴露的 .env 文件与泄露密钥解释这类暴露如何发生,以及为什么光删文件永远不够。建议与为响应加固打分的安全响应头深度检查、以及审计第三方脚本的第三方脚本审计搭配使用。
最后更新:
想持续监控这个网站?用 myeventwatch 免费监控——到期和宕机提醒,无需绑卡。
什么算暴露——什么不算
扫描器用普通的公开 GET 请求探测一份公布的常见路径清单——/.env 及其常见变体、/.git/HEAD 与 /.git/config、配置文件、备份压缩包和密钥文件——正是攻击者、搜索引擎或好奇的访客能发出的同种请求。一个路径只有当响应内容与该文件应有的样子相符时才算暴露:env 文件必须能解析为键值行,Git HEAD 必须长得像 Git 引用。许多服务器对每个路径都回答 200——单页应用回退、自定义错误页、全捕获重写——而一个装着你首页 HTML 的 200 不是泄露。这类路径会在结果中单独列为有响应但未确认,供你自行判断;本工具绝不把未确认的 200 称为泄露,你使用的任何扫描器也都不应该这样做。
在文件探测之外,扫描器还会抓取页面本身以及最多约十五个 JavaScript 包,在其中搜索已知密钥形态:云访问密钥 ID、私钥头、通用 API 密钥与令牌赋值、数据库连接字符串等高信号模式。客户端代码按定义就是公开的——发送到浏览器的任何东西都能被每个访客读取——所以在包里找到的真实凭据,即使没有任何文件配置错误,也已经暴露。发现结果按类型、来源文件和出现次数报告,其值最多打码到只剩前四个字符:足够你认出是哪把钥匙,永远不足以让报告的读者拿去使用。完整的密钥从不被取入、存储或显示在这份报告中。
局限,明说在前面
这是一次公开的、只读的常见路径探测,它的局限是结果的一部分。它只请求公布清单上的路径——放在异常文件名里的密钥不会被找到。它扫描落地页和粗略十五个脚本包,而不是大型站点的每个资源,并且不会登录、不在认证后爬取、不爆破文件名,也不测试任何未经认证 GET 本就够不到的东西。扫描限速为每位访客每小时 5 次,结果缓存10 分钟,因此该窗口内的重扫可能显示缓存结论。扫描也有时间预算:慢目标用完预算时,结果会标为部分并明说——请把部分干净结果理解为“未完整检查”,而不是“干净”。
如果扫描发现了问题,工作的顺序比删除的速度更重要。先轮换凭据——吊销已暴露的密钥并签发新密钥——因为副本可能已经存在于缓存、归档和别人手里;删除文件只能停止新的下载,对已经流出的密钥毫无作用。然后在服务器上移除或封锁该文件,清除可能存有副本的 CDN 与代理缓存,并检查访问日志中对同一路径的更早请求。配套文章暴露的 .env 文件与泄露密钥按顺序走完攻击者使用的第一小时手册和完整的恢复流程。
相邻的检查补全画面:第三方脚本审计覆盖你的页面加载的外部脚本——那是与自有文件泄露不同的供应链风险——安全响应头深度检查则为你的响应所携带的浏览器保护打分。关于方法的一点说明:干净结果意味着在扫描时刻、从检查器的网络位置看,被探测路径没有一条以匹配内容响应,被扫描文件中也没有出现已知密钥模式。它是关于那些路径和文件的证据,并非对整台服务器的保证——首先就把文件放在 Web 根目录之外,并在每次触及服务器发布内容的部署变更后重新扫描。
公布的探测清单
| /.env 及其变体 | 保存数据库密码、邮件凭据和 API 密钥的环境文件(.env、.env.local、.env.production 等)。只有正文能解析为键值行时才确认。 |
| /.git/HEAD 与 /.git/config | 被服务的 .git 文件夹会披露仓库:HEAD 证明布局,config 常写着远程地址。两者齐备时,完整的源代码历史通常可以重建。 |
| 配置文件 | 携带明文凭据的常见配置路径(例如 wp-config 备份、config.php 副本与框架配置文件)。 |
| 备份与归档文件 | 遗留在 Web 根目录的数据库转储、.zip / .tar.gz 站点归档和编辑器备份副本——往往是整站的完整副本,凭据也在其中。 |
| 密钥与证书文件 | 绝不应可经 Web 访问的私钥形态文件(.pem、.key、id_rsa 式命名);被服务的私钥本身就是严重发现。 |
| JavaScript 包 | 页面加上最多约 15 个脚本包,搜索云密钥 ID、私钥头、令牌赋值和连接字符串。值最多打码到只剩前四个字符。 |
| 确认规则 | 探测只有在响应内容符合预期文件形态时才算暴露。裸 200 列为有响应未确认,绝不报告为泄露。 |
| 预算与缓存 | 仅公开 GET 探测、只读,每位访客每小时 5 次扫描,结果缓存 10 分钟。用完时间预算的扫描标为部分。 |
常见问题
扫描说某个路径“有响应但未确认”。那是泄露吗?
就这份证据而言不是。它意味着该路径以 HTTP 200 响应,但内容与被探测文件的形态不符——通常原因是全捕获路由或回退页对每个 URL 都返回你的首页或应用外壳。在无痕窗口里自己打开该路径,看真正返回什么:若看到真实文件内容,按暴露处理;若看到正常网站,那只是回退。
扫描器找到了我的一把密钥。我先做什么?
先轮换它——吊销已暴露的凭据并签发替代品——在做任何其他事之前。公开文件的副本会迅速逃进缓存、归档和扫描器的数据库,所以删除文件并不能让密钥“取消泄露”。然后移除或封锁文件,清除 CDN 与代理缓存,审查该路径的访问日志,并检查同一凭据还被用在别处没有。
扫描器会存储或显示它找到的完整密钥吗?
不会。检查器只报告密钥类型、所在文件和出现次数,值最多打码到前四个字符——足够认出是哪份凭据,永远不足以使用它。报告里没有任何值得偷的东西,这是刻意的:一份泄露报告不应该变成第二次泄露。
它能扫描我的预发布站点或登录后的页面吗?
不能。扫描器只发出未经认证的公开 GET 请求,所以登录、VPN 或 IP 白名单之后的一切都够不到——这是刻意的,因为它回答的问题是互联网上的陌生人能取走什么。被封锁的目标(包括本站自身的基础设施地址)会被直接拒绝。
为什么我的结果是缓存的或部分的?
结果缓存 10 分钟,让重复检查更便宜,也让扫描器在目标服务器上做个有礼貌的客人;结果会注明何时为缓存。部分结果意味着扫描在完成每条探测前撞上了时间预算——通常是慢目标或许多大包——横幅会说明这一点,部分干净结果应重新运行,而不是当作完全干净来信任。