JavaScript混淆器

代码混淆会增加阅读JavaScript源代码的成本,虽非绝对(前端代码混淆并非万无一失),但足以阻碍随意检查并降低自动化抓取效率。该工具采用字符串数组编码、标识符混淆、控制流扁平化以及可选的死代码注入等技术,各项选项均可根据你所需的混淆强度进行选择。

如何混淆JavaScript代码

  1. 1

    粘贴源代码

    任何有效的JavaScript代码均可使用。若代码依赖于宿主页面中的特定全局属性名称,请将这些属性设为保留属性。

  2. 2

    选择技术

    字符串编码(hex / base64)、标识符混淆、控制流扁平化、死代码注入、自我防御包装器。

  3. 3

    选择目标配置文件

    浏览器(支持ES5标准,不支持Node.js API);Node.js(支持`require`、`Buffer`格式);或低级版本(主要为精简版)。

  4. 4

    混淆

    该工具会输出经过转换且带有大小增量(delta)的代码。若使用激进设置,输出代码的体积可能达到源代码的3至5倍。

技术方法及其费用

技术 增加攻击者的攻击难度 运行时成本 大小成本
变量重命名 可忽略不计 较小(压缩带来的副作用)
字符串数组编码 中等 微小(每个字符串仅需一次查找) +10–30%
控制流扁平化 可测量(约2–5%) +50–150%
死代码注入 低(安全表演) 小型 +20–50%
自保护包装 中号 单次检测 +5-10%
调试保护 中等(可检测 DevTools) 一次性检查 +5%
虚拟机/虚拟化(高级版) 极高 较大(5–20倍) +300–500%

隐匿手段无法保护的内容

  • 密钥与参数。 在前端源代码中,任何常量若暴露足够长时间,都可能被破解。API密钥、身份验证密钥、定价逻辑等均不可依赖混淆技术进行隐藏,必须将其移至服务器端处理。
  • 具有可观察输出的算法。 如果浏览器能够运行该算法,具备调试功能的攻击者即可观测其所有输入和输出。混淆技术虽能延缓这一过程,但无法完全阻止。
  • 大规模自动化数据抓取。 防抓取机制依赖于行为检测(指纹识别、速率限制、验证码验证),而非源代码混淆技术。

当混淆处理值得时

  • 对嵌入式SDK(授权类SDK、广告SDK、游戏客户端)实施防篡改功能。
  • 提高对竞争对手实现方案进行简单复制粘贴操作的成本。
  • 使广谱爬虫更难以实现自动化脚本分类。

当这种做法适得其反时

  • 您已配备一个打包工具:Webpack + Terser 在生产环境中即可对本地文件进行压缩和混淆处理。额外增加一次混淆步骤几乎不会带来额外收益,反而会增大最终包的体积。
  • 您正在针对首次渲染/核心网页关键指标进行优化。过度混淆会使性能开销增加三倍,从而影响首次加载时间(FCP)和最终加载时间(LCP)。
  • 你必须对生产环境进行调试。过度的代码混淆会使Sentry堆栈追踪在没有对应源代码映射的情况下几乎毫无用处;而发布源代码映射反而会破坏代码混淆的效果。

常见错误

  • 将混淆处理等同于加密。其实并非如此,它只是一道减速带。
  • 将源映射与经过混淆处理的程序包一同部署到生产环境,这会彻底消除混淆效果。
  • 混淆您已从 CDN 加载的第三方库。此举不仅会增加程序体积,且毫无实际收益。

常见问题

不。混淆代码只是个障碍,并非真正的防护措施。具备调试能力的资深分析师完全能够还原其逻辑结构。虽然这种做法会显著增加开发成本,从而阻碍随意检查和大多数自动化数据抓取工具的应用,但它并不能构成真正的安全防护。

若您动态访问属性(obj["field_name"]Object.keys(obj))或依赖主机页面中的特定函数/类名称,请将这些名称添加至预留列表。否则,重命名属性可能破坏外部集成功能。

请保留原始数据。混淆器是一种单向变换;无法从混淆后的输出中精确还原原始内容,仅能获得可读的近似值。

轻度混淆可增加约10%至30%的体积;控制流扁平化结合字符串数组处理则会增加50%至150%;最高强度设置下体积可能增至三倍。发布前请务必检查输出文件大小。

相关工具

此工具还提供其他语言版本