硬编码文本只能靠实际运行发现
别名: 硬编码文案检测 · 未资源化字符串 · 字符串 lint · runtime localization scan
概念解释
硬编码用户可见字符串检测(hard-coded user-facing string detection)寻找绕过消息资源、无法进入翻译与版本追踪的界面文本。实际运行或渲染扫描能证明某个可达状态最终显示了未变换文本,尤其适合发现由条件分支、服务端错误、通知或第三方组件带入的字符串;但它不是唯一发现途径。AST lint、静态分析、资源提取差异和资源使用追踪可以更早定位许多源码与模板中的字面量。
机制
硬编码字符串分散在客户端组件、模板、后端响应、日志转用户消息的映射、图片与平台清单中,任何单一检测器都只能观察一部分。静态规则看得到未执行代码和提交差异,却难以判断某个字面量是否真的面向用户,也会漏掉运行拼接、反射、远端配置和编译产物。伪 locale 下的运行扫描可把正常资源变换后剩余的源语言片段突出出来,但只覆盖已经到达并成功渲染的状态。资源图还能找出缺键、未引用键和绕过目录的调用,前提是构建链保留可追踪关系。
怎么研究
用分层植入集评估检测体系:分别放置直接 UI 字面量、模板文本、拼接字符串、服务端错误、推送/邮件、平台元数据和第三方 fallback,测每种检测器的 precision、recall、定位时间与修复前置程度。运行覆盖需按路由、权限、功能开关、网络结果和错误状态报告,不把代码覆盖率直接当字符串可见状态覆盖率。误报分析应区分品牌名、协议词、示例数据和真正不可翻译内容;若 allowlist 不记录理由、所有者与期限,它会逐渐变成漏检通道。
边界
把“只能靠实际运行发现”理解为只有运行扫描这一种方法过于绝对:运行证据对动态与集成路径不可替代,静态证据则能在合并前覆盖尚未执行的代码,两者应互补。源语言片段也不必然是硬编码,例如品牌名、用户内容或经审核的不可翻译词;反过来,硬编码文本可能恰好与伪 locale 字符相似或出现在不可遍历状态。OCR 能提示图片中的文字,却不能恢复可本地化资源语义。检测通过只说明资源化路径可追踪,不证明翻译正确或布局可用。
怎么落地
- 在源码、模板和声明文件上运行面向 UI sink 的 AST lint 或平台静态规则,禁止未经资源 API 的用户可见字面量;对允许项保存类别、理由、所有者和复审期限,不用全局字符串白名单。
- 在构建中比较资源提取结果、目录键、引用图和各 locale 覆盖,阻止缺键、未知键与绕过统一资源接口的新增调用;对服务端错误、通知、邮件和平台元数据建立同样的资源来源追踪。
- 在伪 locale 下遍历关键路由、权限、开关、空态与失败态,扫描 DOM、原生视图树、可访问名称和截图中未变换的源语言片段;用可重复状态夹具触发低频错误,而不是等待生产偶遇。
- 合并静态与运行发现,以文件位置、资源键、页面状态和构建版本去重。发布前要求所有命中已修复或有窄范围审核豁免,并用植入缺陷持续校准各检测器的漏报,而不把“零告警”当作翻译质量结论。