前端代码混淆后怎么防止别人调试绕过?
我用 webpack 打包时加了 Terser 做了代码压缩和变量名混淆,但发现别人在 DevTools 里打个断点或者格式化一下,逻辑还是能看懂。试过加 debugger 反调试,结果一刷新就卡死,用户体验太差了。
有没有更靠谱的防调试方案?比如检测到 DevTools 就自动清空关键数据?我看到有些网站用定时器检查窗口尺寸变化来判断是否打开了控制台,但不确定是不是有效,而且怕影响正常用户。
setInterval(() => {
if (window.outerHeight - window.innerHeight > 200 ||
window.outerWidth - window.innerWidth > 200) {
// 清空敏感数据?
localStorage.clear();
}
}, 1000);
你提到的窗口尺寸检测方案,问题挺多的。首先现在新版浏览器这招不太灵了,其次移动端用户很容易误触,再者专业调试者只需要 Hook 一下
Object.defineProperty或者覆盖window.outerWidth就绕过了。清空 localStorage 更是没意义,数据服务器那边有备份。真正靠谱的思路就两条:
第一条,别在前端放敏感逻辑。 业务关键判断、算法核心、用户权限校验这些必须放后端。前端充其量就是个展示层和简单校验,破解了也拿不到核心数据。
第二条,如果非要增加逆向成本,可以这么搞:
用 WebAssembly 把关键逻辑编译了,C/C++ 编译成 wasm 比 JS 难读得多。代码层面可以用 jscrambler 这类商业混淆工具,比 Terser 强一个档次。反调试检测可以组合使用,比如检测 console 是否被重写、检测 Function.prototype.toString 是否被 Hook、定时器检测当前执行栈深度。但这些检测本身也会被发现,所以别放太多精力在这上面。
接口层面做签名校验和时效性验证,服务器记录异常请求频率并封 IP,这些比前端防护有用多了。
说白了,前端安全的上限就是"增加调试成本",别指望能完全拦住。资源有限的情况下,把精力放在后端校验和接口安全上更划算。