js禁止控制台执行

手把手教你如何用JS代码实现禁止打开控制台

主要为了通过禁止打开控制台,防止别人进行代码调试。


1、禁止右键查看源码和F12

//禁止F12键盘事件document.addEventListener('keydown', function(event){   return 123 != event.keyCode || (event.returnValue = false)});//禁止右键、选择、复制document.addEventListener(‘'contextmenu'’, function(event){   return event.returnValue = false})

破解:还可以使用浏览器菜单中的开发者工具打开控制台

2、通过页面宽度变化监测控制台

浏览宽高变化监测主要是监测浏览器可视区域的宽高:window.innerWidth / window.innerHeight(滚动条和内容区)和浏览器宽高:window.outerWidth / window.outerHeight(inner的基础上加上工具条的宽高)之间的差值。

因为我们不知道浏览器是否开启了工具条及工具条的宽高,所以我们设置一个阈值如200,如果outer – inner 大于200,我们就认为开启了控制台。

function resize(){ var threshold = 200; var widthThreshold = window.outerWidth - window.innerWidth > threshold; var heightThreshold = window.outerHeight - window.innerHeight > threshold; if(widthThreshold || heightThreshold){ console.log('控制台打开了') }}window.addEventListener('resize', resize);resize()

关于检测窗口大小,有人专门针对此写了个库:***/sindresorh…,感兴趣的可以去看一下。

破解:监测浏览器宽高变化的缺点是非常明显的,因为这种监测只能针对控制台内嵌的情形,但是很多浏览器都支持独立窗口式的控制台。

3、利用控制台特性改写对象toString

对于一些浏览器,如果控制台输出的是对象,则保留对象的引用,每次打开控制台的时候,如果对象类型是function、date等(以前还有regexp,现在已失效),都会重新调用一下对象的toString()方法,将返回结果打印到控制台上。

经过测试:1)、先声明对象,再重写toString,最后打印对象,那么toString会在开始时多运行一次,所以可以使用一个计数器来判断哪次有效2)、先声明对象,再打印对象,最后重写toString,那么如果初始化时控制台是开启状态,会检测不到这一次的状态3)、先声明对象,再重写toString,最后打印对象,但是对象不作为第一个参数,此时就可以成功监测每一次控制台状态了4)、console.log、console.info、console.error等均有效5)、只在chrome内核浏览器有效,firefox、ie失效

var devtools = new Date(); //function(){};devtools.toString = function() { console.log('控制台打开了'); //或执行一段死循环 window.open("about:blank", "_self"); }console.log('', devtools);

破解:可通过标签注入js代码清空控制台(添加一个网页标签,标签网址为Javascript:console.clear();,进入网页后,点击该标签页,就会运行里面的代码),如果是定时器执行上述代码,还需要重写清空console(Javascript:console.clear();for(var k in console){if(typeof console[k] == 'function'){console[k] = function(){}}};)。

4、利用控制台特性进行监听dom属性

大部分浏览器在打印dom元素的时候,如果控制台处于关闭状态,不会获取元素属性,但是如果控制台处于开启状态,就会自动获取dom属性,从而触发监听事件

function observerConsole(){ //这里使用dom元素,在打开控制台时才会计算id var dom = document.createElement("div") Object.defineProperty(dom, "id", { get: function(){ console.log('控制台打开了') } }) //ie不支持console.table //console.info(dom); console.log(dom);}

除了使用console.log,我们还可以使用console.info,console.dir和console.error等等,需要注意的是ie不支持console.table

破解:通过标签注入js代码清空控制台,如果是定时器执行打印dom的操作,还需要重写清空console。

上述方法需要注意浏览器对于defineProperty的支持,另外在firefox浏览器失效,因为firefox浏览器对于对象中监听的属性不会取值,需要手动点开才会触发。所以对于firefox需要另辟蹊跷才行,这里我选择使用debugger语句来实现,debugger 语句调用任何可用的调试功能,可以阻断代码执行,如果没有调试功能可用,则此语句不起作用。所以我们可以在debugger前记录时间,如果debugger没有触发,运行几条语句的时间几乎为0,但是如果被触发,那间隔时间就不是几十、几百毫秒了。

function observerConsole(){ var obj = Object.create(null), t = Date.now(); Object.defineProperty(obj, "a", { get: function() { if(Date.now() - t > 100){ console.log('控制台打开了') } } }) setInterval(function(){ t = Date.now(); (function(){})["constructor"]("debugger")();//debugger; console.log(obj.a); }, 200)}

缺点:如果浏览器取消了debugger调式,那么就毫无意义了。chrome:

手把手教你如何用JS代码实现禁止打开控制台

Firefox:

手把手教你如何用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、总结

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 7月 12日 上午9:50
下一篇 2023年 7月 12日 上午9:56

相关推荐

  • 有关鼠年的春联带横批,鼠年春联带鼠字图片

    丙辉瑞应 , 子庶丰登。 丙名世德 , 子夜凯旋。 丙年春满 , 子夜灯红。 丙年凤仪 , 子夜钟鸣。 丙年兴旺 , 子民腾欢。 人喜盛世 鼠兆丰年 子年人瑞 丙岁春温 子年润泽 …

    2022年 11月 5日
  • 俄国现实主义画家列宾的代表作是

    33幅 列宾关于风俗画等的作品 供大家欣赏 《库尔斯克省的宗教行列》 伊里亚·叶菲莫维奇·列宾(Илья Ефимович Репин ,Ilya Yafimovich Repin…

    2022年 11月 5日
  • 我的三个假想敌,我的假想敌中父亲形象

    多年前与尚在初中的女儿一起读余光中先生的《我的四个假想敌》,感觉到文笔的幽默风趣,俩人很是快意大笑了一番。时间过去了十来年,也许女儿早已经忘记了这篇散文,但是这篇文章却一直藏在我的…

    2023年 5月 13日
  • 给《浪姐3》最没有观众缘的十位姐姐排名,吴莫愁第四,黄奕第七

    《浪姐3》一上线,霸屏热搜,直接成为综艺里的顶流。 它能受到如此大的关注度,主要源于节目组请到的嘉宾,那英和宁静压场,还有阿雅、Twins、王心凌、谭维维这些人气和实力兼具的。 其…

    2022年 11月 8日
  • 中国诗词大会:陶渊明为什么被称为“靖节”先生?

    古代历史上的皇帝、皇后以及诸侯大臣等社会地位较高人物,在其去世之后,朝廷或其门生故吏会依据其生前所作所为,给出一个具有评价意义的称号,用来高度概括他的生平,这就是通常意义的谥号。谥…

    2022年 11月 11日
  • 黄山归来不看岳的前一句是什么诗句

    黄山,位于中国安徽省黄山市境内,是中国著名风景区之一,也是世界自然遗产。黄山有奇峰72座,峰峰称奇,独具特色,神韵各不相同。其中天都峰、莲花峰、光明顶都在海拔1800米以上,它们高…

    2024年 2月 2日
  • 蓝牙车载

    写在前面 随着智能产品的发展,已经有越来越多的智能终端进入我们的视野,我们普通的客厅不再是客厅,而是智能客厅,我们的手机也不再是简单的通话工具,而被冠名为智能手机,而传统的汽车,也…

    2022年 11月 5日
  • 比较级和最高级的知识点总结

    变化规则 大多数形容词和副词有比较级和最高级的变化,即原级、比较级和最高级,用来表示事物的等级差别。原级即形容词的原形,比较级和最高级有规则变化和不规则变化两种。 (1)单音节词加…

    2023年 4月 28日
  • 马蹄其实是马的什么

    中国小康网讯 “马蹄”其实是马的?一个人每天大约会分泌多少口水?这就是支付宝蚂蚁庄园小课堂5月31日的两个问题。小鸡宝宝考考你,答对就可以获得180g小鸡饲料!喂养小鸡之后可以进行…

    2022年 11月 30日
  • 诸葛亮几个老婆,诸葛亮有几个老婆?,诸葛亮有几个老婆

    诸葛亮,181年出生于山东临沂的一个官宦家庭,他的先祖诸葛丰曾经在东汉王朝做过司隶校尉。到了诸葛亮的父亲这一代,诸葛亮的家族开始衰败。由于父母早亡,诸葛亮不得已跟着叔父在各地生活。…

    2022年 11月 5日