Source Map 泄露什么
Source Map(.map 文件)保存了打包产物与原始源码的映射关系,浏览器用它把压缩代码还原成可读源码。生产环境若连同 .map 一起发布,外部可还原出源码结构、模块划分、接口名、路由与注释。它本身不构成执行风险,但会显著降低攻击者的理解成本,属于应主动收敛的信息暴露面。
基本信息
| 触发条件 | 构建时生成 sourcemap 且部署到公开目录 |
|---|---|
| 常见文件 | app.js.map、*.css.map、main.[hash].js.map |
| 识别方式 | 构建产物末尾的 sourceMappingURL 注释 |
| 影响 | 源码结构、接口与注释外泄 |
| 处置方向 | 生产关闭公开 map,或迁移到内网鉴权路径 |
典型使用场景
- 上线前自查:确认生产构建产物不含可公开访问的 .map 文件
- CDN 清理:历史版本目录常残留旧 map,需同步清理
- 内网调试:确需源码级调试时,把 map 放到内网路径并加鉴权
- 前端监控:错误上报平台上传私有 sourcemap 供符号化,不对外发布
- 第三方依赖排查:确认公共库自带的 map 是否被一并发布
构建配置与自查
构建配置与自查
# 构建侧
# Webpack:production 使用 devtool: false
# Vite:build.sourcemap 保持 false(默认即为 false)
curl -sI https://example.com/assets/app.js.map # 期望 404
curl -s https://example.com/assets/app.js | tail -c 200 # 检查是否有 sourceMappingURL 注释
find dist -name '*.map' -print # 产物目录自查常见来源与处置
| 来源 | 表现 | 处置 |
|---|---|---|
| 前端构建配置 | devtool 或 sourcemap 打开 | 生产关闭,仅 CI 内部保留 |
| CDN 历史目录 | 旧版本目录仍有 map | 清理历史发布目录与缓存 |
| 错误监控平台 | map 上传到可公开下载的位置 | 改为私有存储 + 鉴权访问 |
| 静态资源服务器 | 同域直接可 GET | 迁移到内网路径或加访问控制 |
sourcemap 的价值在排错:内部保留一份私有 map(配合错误监控做符号化)比彻底删掉更实用,关键是不对外公开。
构建时关了 map 但 CDN 上仍有历史版本时,扫描仍会命中;收敛动作要拆成两步:新版本不再产出 + 旧产物与缓存一并清理。