javascript控制台怎么打开(js控制台使用详解)

javascript控制台怎么打开(js控制台使用详解)

Firefox:

javascript控制台怎么打开(js控制台使用详解)

汇总3、4,可以做如下封装:

var observerConsole = {    openCallback: function(){        console.log('控制台打开了');        try {            window.open("about:blank", "_self")        } catch(e) {            var btn = document.createElement("button");            btn.onclick = function() {                window.open("about:blank", "_self")            }            btn.click()        }    },    observer: function(){        //这里使用dom元素,在打开控制台时才会计算id        var dom = document.createElement("div"), that = this;        Object.defineProperty(dom, "id", {            get: function(){                that.openCallback()            }        })        //ie不支持console.table        //console.info(dom);        console.log(dom);    },    observerF: function(){        var obj = Object.create(null), t = Date.now(), that = this;        Object.defineProperty(obj, "a", {            get: function() {                if(Date.now() - t > 100){                    that.openCallback()                }            }        })        setInterval(function(){            t = Date.now();            (function(){})["constructor"]("debugger")();//debugger;            console.log(obj.a);        }, 200)    },    init: function(){        var t = window.navigator.userAgent.toLowerCase();        t.indexOf("firefox") >= 0 ? this.observerF() : this.observer();    }}ConsoleManager.init()

破解:通过标签注入js代码清空控制台、取消console.log等反破解:对console.log等进行重写再包装,如

let _console = {      log : console.log,      info : console.info,      warn : console.warn,      error : console.error};

然后使用_console.log等替换上面的console.log。这里可以使用闭包,防止别人对_console的再重写。

代码测试仅测试了firefox、ie、chrome浏览器及部分chrome内核浏览器(如360、qq浏览器、UC浏览器、搜狗浏览器)

5、利用debugger的特性,无限递归

这个方法不能监测控制台被打开,但是能达到不让别人浏览你代码的目的。

上面也说了:debugger 语句调用任何可用的调试功能,可以阻断代码执行,如果没有调试功能可用,则此语句不起作用。

另外:每个浏览器都有其最大调用栈,如果超出就会抛出Maximum call stack size exceeded的错误并终止程序。

利用上面讲的特性组合成下面的代码:

function check() {    function doCheck(a) {        (function() {}["constructor"]("debugger")()); //debugger        doCheck(++a);    }    try {        doCheck(0)    } catch(err) {        console.log(err)    }};

上面代码check运行时,如果控制台未开启,debugger 不会起作用,但是doCheck会不断循环,直至爆栈,抛出错误,中止本次check运行;如果控制台开启,则会不断的进行断点调试和循环doCheck的调用,直至爆栈;如果控制台开启,但是取消了debugger调式,虽然此时debugger 不会起作用,但递归是依然存在的,而且此时网页性能与未开启控制台相比会大幅度下降,严重的话,可能会卡死浏览器。

未开启控制台时代码运行时间:Chrome:30-50msFirefox:200-400msIe:10-30ms开启控制台但取消debugger时代码运行时间:Chrome:1000-2000msFirefox:页面直接卡死

从上面的测试结果来看,我们可以设置一个间隔2000ms的定时器来不断执行check,这样当控制台开启时,不论是否取消debugger调式,都会使页面卡住。另外我们还可以对代码进行混淆,增加阅读困难度,我们还可以利用闭包完成上面操作,防止别人在控制台重置check:check=function(){}。

!function(){    var _0x1cbb = ["tor", "struc", "call", "ger", "con", "bug", "de", "apply"];    setInterval(check, 2e3);    function check() {        function doCheck(_0x1834ff) {            if (('' + _0x1834ff / _0x1834ff)['length'] !== 0x1 || _0x1834ff % 0x14 === 0x0) {                (function() {return !![]}[                    _0x1cbb[0x4] + _0x1cbb[0x1] + _0x1cbb[0x0]                ](                    _0x1cbb[0x6] + _0x1cbb[0x5] + _0x1cbb[0x3]                )[_0x1cbb[0x2]]());            } else {                (function() {return ![]}[                    _0x1cbb[0x4] + _0x1cbb[0x1] + _0x1cbb[0x0]                ](                    _0x1cbb[0x6] + _0x1cbb[0x5] + _0x1cbb[0x3]                )[_0x1cbb[0x7]]());            }            doCheck(++_0x1834ff);        }        try {            doCheck(0)        } catch(err) { }    };}();

优点:兼容性比较好,不易破解

缺点:会影响浏览器性能,造成页面卡顿

破解:想办法重置check函数

6、总结

如果文章和笔记能带您一丝帮助或者启发,请不要吝啬你的赞和收藏,你的肯定是我前进的最大动力

(0)
小多多的头像小多多创始人

相关推荐

发表回复

登录后才能评论