js无限debugger学习总结
静态js代码debugger
1. 几千个含有debugger的script标签
<script> debugger; </script> <script> debugger; </script> <script> debugger; </script> ... 重复几千行
2. 死循环debugger
while(1){
debugger;
}
解决方案
使用抓包工具修改响应,比如fiddler。或者使用 requestly(基于js)
3. 特殊情况: debugger语句在函数里
function check(){ debugger; } check();
解决方案
在check赋值后但还没有执行前,将check函数置空
check = function(){}
动态代码的debugger
1. eval debugger
var code = "de"; code += "bu"; code += "gger"; eval(code); // eval("debugger");
解决方案
// 需要使用油猴或者可以fiddler抓包工具注入该js var oldEval = window.eval; window.eval = function(){ arguments[0] = arguments[0].replace(/debugger/g, ""); return oldEval.apply(this, arguments); }
2. Function debugger
new Function("debugger")();
解决方案
var oldFunction = Function.prototype.constructor; Function.prototype.constructor = function(){ arguments[0] = arguments[0].replace(/debugger/g, ""); return oldFunction.apply(this, arguments); }
3. 动态插入script标签
var script = document.createElement("script"); script.text = "debugger"; document.head.appendChild(script);
解决方案
var setter = Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, 'text').set; Object.defineProperty(HTMLScriptElement.prototype, 'text', { set: function (val) { // 当调用 script.text = "debugger";该方法将被调用 val = val.replace(/debugger/g, ""); return setter.call(this, val); } });
条件debugger
上面的debugger属于手动移除也不影响正常逻辑的执行
有些网站属于检测到控制台打开就会执行错误的逻辑永久也走不到正常的逻辑里