aslan-h5/docs/安全/前端加固-中文.md

195 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前端加固说明
## 目的
这份文档用于记录当前主分支已经落地的前端防扒取加固方案。
核心目标是提高扒图、抄页面、低成本复刻的门槛而不是宣称“前端已经绝对防住”。只要页面能在客户端完整渲染前端就无法彻底阻止抓包、截图、Hook、像素提取或人工复刻。
## 范围
本次加固严格限制在当前前端项目内完成,不依赖:
- 后端接口改造
- 私有 OSS
- 短时签名 URL
- 服务端动态出图
## 已落地能力
### 1. 受保护页面访问限制
生产相关模式下,受保护页面要求运行在官方 App 环境中。
主要文件:
- [src/utils/routeGuard.js](/D:/programs/likei-h5/src/utils/routeGuard.js)
- [src/utils/http.js](/D:/programs/likei-h5/src/utils/http.js)
- [src/config/security.js](/D:/programs/likei-h5/src/config/security.js)
表现:
- 公共页面仍可正常访问。
- 受保护页面在非 App 环境下会跳转到 `/#/not_app`
- 受保护页面内的接口请求在缺少 App bridge 时会被拒绝。
### 2. 运行时防调试与防复制限制
受保护页面增加了轻量运行时限制。
主要文件:
- [src/utils/runtimeSecurity.js](/D:/programs/likei-h5/src/utils/runtimeSecurity.js)
- [src/main.js](/D:/programs/likei-h5/src/main.js)
- [src/App.vue](/D:/programs/likei-h5/src/App.vue)
表现:
- 屏蔽常见开发者工具快捷键。
- 屏蔽右键、拖拽、复制、文本选择等交互。
- 降低长按保存图片的便利性。
### 3. `Activities` / `Ranking` 图片受保护地址层
`Activities/``Ranking/` 目录下的大部分图片,不再直接以真实 OSS 地址出现在模板中。
主要文件:
- [src/config/imagePaths.js](/D:/programs/likei-h5/src/config/imagePaths.js)
- [src/utils/protectedAssets.js](/D:/programs/likei-h5/src/utils/protectedAssets.js)
- [src/utils/protectedAssetRuntime.js](/D:/programs/likei-h5/src/utils/protectedAssetRuntime.js)
- [src/directives/smartImage.js](/D:/programs/likei-h5/src/directives/smartImage.js)
表现:
- 模板中更多使用 `likei-protected:` 形式的受保护地址。
- 运行时再解析为真实图片地址。
- 大部分图片最终会走缓存并转换成 blob/object URL。
### 4. 图片缓存和单图版本控制
图片缓存用于减少重复网络下载,但不再追求过大容量。
主要文件:
- [src/config/imageCacheVersion.js](/D:/programs/likei-h5/src/config/imageCacheVersion.js)
- [src/utils/image/imageCacheManager.js](/D:/programs/likei-h5/src/utils/image/imageCacheManager.js)
当前策略:
- 默认最多缓存 120 张图片。
- 最大缓存体积为 80MB。
- 普通发版不更新全局缓存版本。
- 单张图片替换时,优先上传新文件名并同步修改 H5 引用。
说明:之前评估过 `assetVersions` 单图版本参数方案,但在只改 H5 和 OSS 图片、无法稳定控制 CDN/浏览器缓存链路的情况下,容易出现发布后仍命中旧图的问题,因此已取消。
### 5. 构建产物收口
生产构建使用内容 hash减少可读文件名暴露也提升缓存稳定性。
主要文件:
- [vite.config.js](/D:/programs/likei-h5/vite.config.js)
- [nginx/default.conf](/D:/programs/likei-h5/nginx/default.conf)
- [nginx/default_hooka.conf](/D:/programs/likei-h5/nginx/default_hooka.conf)
表现:
- JS/CSS/资源文件名使用内容 hash。
- HTML 短缓存,静态资源长缓存。
- 内容不变的资源在普通发版后可以继续命中缓存。
### 6. CSS 背景受保护地址桥接
部分页面必须使用 `background-image`。这类场景通过 `toCssBackgroundImage()``likei-protected:` 地址转换为 CSS 可用的 `url(...)`
主要文件:
- [src/utils/protectedAssets.js](/D:/programs/likei-h5/src/utils/protectedAssets.js)
## Canvas 背景方案已取消
之前 [BackgroundLayer.vue](/D:/programs/likei-h5/src/components/BackgroundLayer.vue) 增加过 `useCanvas` 模式,用于把多张装饰背景绘制到单个 canvas 中,减少在 Elements 面板里直接看到背景 `<img>` 列表的便利性。
经过低端机性能排查后,该方案已取消。
当前约定:
- `BackgroundLayer` 仍保留 `useCanvas` 入参,兼容历史页面调用。
- 当前实现不再生成 canvas统一渲染为普通 `<img v-smart-img>`
- 图片仍继续走受保护路径解析和图片缓存链路。
- 不再把 canvas 背景作为默认防扒取方案。
取消原因:
- 大尺寸 canvas 会增加内存占用和绘制成本。
- 低端安卓 WebView 中canvas 背景叠加弹幕、跑马灯、头像列表时容易放大卡顿。
- canvas 只能降低从 Elements 面板直接复制背景结构的便利性,防不住抓包、运行时 Hook 或最终像素提取。
- 页面打开速度、滑动和动画流畅度优先级高于这点有限防护收益。
## 当前边界
这套改动依然无法彻底防住以下情况:
- 通过 Network 面板或抓包获取图片请求。
- 有经验的人持续分析前端运行时代码。
- 自定义 WebView、自动化脚本、Hook 等方式截获资源。
- 通过截图、录屏、最终像素提取还原视觉。
- 人工观察后重新临摹布局和样式。
## 推荐测试方式
### 受保护页面拦截
可使用:
```bash
npm run dev:prod
```
或:
```bash
npm run build
npm run preview
```
预期结果:
- 非 App 环境下访问受保护页面会跳转到 `/#/not_app`
- 公共页面仍可正常访问。
### 页面与图片链路验证
在接近生产环境的模式下检查:
- `Activities` / `Ranking` 页面是否仍能正常展示。
- 受保护图片是否仍能正常显示。
- 运行时 DOM 和构建产物中是否更少直接暴露真实图链。
- 替换图片后,新文件名引用是否能在用户端稳定加载。
### 性能验证
重点在低端安卓 WebView 上检查:
- 首屏打开速度。
- 背景图片加载是否正常。
- 滑动是否流畅。
- 弹幕、跑马灯等持续动画是否造成明显卡顿。
### 构建产物验证
执行:
```bash
npm run build
```
预期结果:
- `dist/js` 文件名以 hash 为主。
- `dist/css` 文件名以 hash 为主。
- 构建产物文件名中不再直观出现页面名。
- 生产包中不再保留 `console.log``console.debug``console.info``debugger`