前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【安全】如何防止他人恶意调试你的web程序

【安全】如何防止他人恶意调试你的web程序

作者头像
pingan8787
发布于 2021-10-08 07:05:31
发布于 2021-10-08 07:05:31
83800
代码可运行
举报
文章被收录于专栏:前端自习课前端自习课
运行总次数:0
代码可运行

1前言

看到社区很多都在讨论如何调试,如何高级的调试,以及一些调试的奇技淫巧,今天我想和大家聊聊,怎么禁止调试,禁止他人调试我们的程序

为什么会有这篇文章呢,源自一次我寻找盗版电影的遭遇,一次好奇心的驱使下,由于很多这种平台都是只做搬运,不做存储,因为存储盗版电影向他人提供是违法的,特别是那种刚出的新电影! 当时好奇想通过看某站的控制台,想了解一下他们是怎么是通过啥接口,怎么请求,请求来的格式啥样的,抱着这样的好奇心,开始了我的奇妙之旅...

看完本篇文章你将学会 我无法断定你能学到什么,但是以下是我希望你能从本篇文章中学到的:

  1. 如何简单的防止你的程序被他人恶意调试
  2. 逆向思维学会如何更好的调试

2具体实现

防止调试的方法,这里我们主要是通过不断debugger的方法来疯狂输出断点,让控制台打开后程序就无法正常执行 我们都知道debugger只有在控制台被打开的时候才会执行,所以后面的所有方法都是围绕着这一特性来进行,废话不多说,我将通过以下几个案例向你们展示道高一尺魔高一丈的道理,先上代码:

方法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(() => {
    function block() {
        setInterval(() => {
            debugger;
        }, 50);
    }
    try {
        block();
    } catch (err) {}
})();

通过上方的代码我们可以看到,在页面中打开控制台后,会有以下结果:

需要在这里说明以下几点:

  1. 程序被debugger阻泄了,我们无法像以往一样在 Source Tab 中的对应 js 代码处添加断点调试,无法调试程序的执行逻辑.在程序异常复杂且被混淆后的代码是异常难读的!通常我们会在 source 的左边加上 breakpoint 来让程序每次走到加点的地方停下来,以便让我们查看一些变量的值或是步骤的流程逻辑(如下图所示)
  1. 我们都知道,第一次打开控制台是看不到 network tab 中的任何请求的,所以我们想通过 network tab 来查看网页都做了哪些请求,也是看不到的,当我们打开控制台就会出debugger阻挡我们,我们可以通过下面的解决方法来处理,或者是用抓包工具来查看具体的请求

大家可以先不看解决方法,想想如果是你,这个时候怎么突破这个屏障呢? 第一次遇到这种情况我也是很懵,不知道咋处理,后面发现问题简直不要太简单,我们可以带着疑问来看:

对于第一个示例,我们如何解决?(绕过它)

答案是: 禁止断点

可以看到很简单,在 Chrome 控制台的 Source Tab 页点击 Deactivate breakpoints 按钮或者按下 Ctrl + f8(如下图所示)。但是对于控制台不熟悉的小伙伴,很难会想到这里去.

但是,难道这篇文章就这样结束了?那我可顶不住小伙伴们的 "就这?" 😂

其实,上面的解决方法并没有帮我们解决根本问题,我们需要做的是调试,上面虽然把debugger都去掉了,但是我们也无法在通过点击每一行代码左边的行号添加 breakpoint,所以根本性的问题,并没有解决,只是去除了那碍眼的疯狂 debugger,我们还是得另辟蹊径

方法二:

对对应的代码行,通过添加logpoint为 false,然后按回车后刷新网页,发现成功跳过无限 debugger,于是我们就可以愉快的自由调试了~

对应的还有一种方法

即通过add script ignore list来添加需要忽略执行代码行或文件

可以看到,我们也可以通过删除 script ignore list 里已添加的忽略代码,恢复初始状态

但是,你这么聪明,那人家不得想想对策?

对于上面的第一个方法 🎈

setInterval(() => {debugger;}, 50);写在一行中,你即使通过添加logpoint为 false,也没用,仍然是疯狂 debugger,即使你可能想到,通过左下角的代码格式化,来格式一下setInterval(() => {debugger;}, 50);将它变成多行的,也是没用的,仍然会在刷新后重新弹 debugger

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(() => {
    function block() {
        setInterval(() => {debugger;}, 50);
    }
    try {
        block();
    } catch (err) {}
})();

对于第二个方法,我们对代码进行如下改造😬

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(() => {
    function block() {
        setInterval(() => {
            Function("debugger")();
        }, 50);
    }
    try {
        block();
    } catch (err) {}
})();

我们可以通过将debugger改写成Function("debugger")();的形式,来应对;Function 构造器生成的 debugger 会在每一次执行时开启一个临时 js 文件,哈哈~对方表示好无奈 😅

于是会有以下结果

这无限套娃,真够狠的,我们要坚信正义最后总会胜利,不能给想非法调试我们程序的人机会,所以我们要把各种情况都考虑周全,可以说这种方法是最恨的,但是这还不算完~ (好家伙~ 😀 想非法调试我程序,那你就得战胜我)

强化以上方法

上面的代码由于没有加密混淆,多少可能还是会被别人读一些,那么我们加密混淆看看是啥样的 好家伙,你这咋读?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eval(function(c,g,a,b,d,e){d=String;if(!"".replace(/^/,String)){for(;a--;)e[a]=b[a]||a;b=[function(f){return e[f]}];d=function(){return"\\w+"};a=1}for(;a--;)b[a]&&(c=c.replace(new RegExp("\\b"+d(a)+"\\b","g"),b[a]));return c}('(()=>{1 0(){2(()=>{3("4")()},5)}6{0()}7(8){}})();',9,9,"block function setInterval Function debugger 50 try catch err".split(" "),0,{}));

格式化后的样子

我们继续对代码进行改造,让对方尽量的难以识别我们的代码 将Function("debugger").call()改成(function(){return false;})["constructor"]("debugger")["call"]();并且,添加条件,当窗口外部宽高,和内部宽高的差值大于一定的值,我把 body 里的内容全部清空掉,看你还能不能操作我的按钮啊啥的~哈哈哈 😀

需要特别说明的是: 像 toG 的项目或者是一些为了保护自己的版权又或者是一些比较敏感的项目,出于安全的考虑在部署到生产环境后最好是不让别人调试的,当然,前端所做的也就那么一些,需要前后端一起配合,便可以很好的对项目或者数据进行私密的保护 🧡

最后: 附上这份未混淆的来之不易的的代码(记得混淆后使用哦~) 😢 一定要记得点赞加关注~原创太不容易了.

你可以把它当作你的工具函数,在需要不让别人轻易调试的项目中引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(() => {
    function block() {
        if (
            window.outerHeight - window.innerHeight > 200 ||
            window.outerWidth - window.innerWidth > 200
        ) {
            document.body.innerHTML =
                "检测到非法调试,请关闭后刷新重试!";
        }
        setInterval(() => {
            (function () {
                return false;
            }
                ["constructor"]("debugger")
                ["call"]());
        }, 50);
    }
    try {
        block();
    } catch (err) {}
})();

3推荐一个调试页面的小技巧

说了那么多的防止被人调试,那么最后也说一个本人觉得眼前一亮的调试样式的方法 通过给style标签添加style="display: block",contenteditable两个属性实现在页面中便捷的调试样式

复制下方代码到你的 html 文件中,玩一下~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<body>
    <div>来调试我吧~</div>
    <style style="display: block" contenteditable>
        body {
            background-color: rgb(140, 209, 230);
            color: white;
        }
        div {
            background-color: green;
            width: 300px;
            height: 300px;
            line-height: 300px;
            text-align: center;
        }
    </style>
</body>

4最后

我所知道的禁止调试的方法就只有如上所述,但是肯定还有很多好玩的,小伙伴们可以在评论区留言,一起共同学习~

最后抛出一个问题,如何监测控制台是否被打开(我上面提到过),感兴趣且有头绪,或者已经有方法的小伙伴可以小伙伴可以在评论下方说说自己的想法,也可以加我们交流群一起玩耍~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自习课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端页面如何禁止别人调试
我们都知道 debugger 在控制台被打开的时候就会执行, 前端页面防止调试的方法主要是通过不断 debugger 来疯狂输出断点,让控制台打开后程序就无法正常执行,以下是一个基本防止调式的代码:
越陌度阡
2022/05/06
1.8K0
前端页面如何禁止别人调试
前端开发中这些小技巧,你知道几个?
浏览器地址栏运行JavaScript代码 javascript:alert('hello!'); Firefox不支持; 其他浏览器必须手动输入才可执行; 浏览器地址栏运行HTML代码 data:text/html,<h1>Hello, world!</h1> 在非IE浏览器可以运行 浏览器变成文本编辑器 地址栏输入: data:text/html, <html contenteditable> 控制台输入: document.body.contentEditable='true'; 利用a标签自动
Vam的金豆之路
2021/12/01
3610
禁止别人调试自己的前端页面代码
江户川码农
2023/08/01
6660
禁止别人调试自己的前端页面代码
突破前端反调试--阻止页面不断debugger
不知道你们有没有遇到过上图这样,有时候想调试网站,一打开开发者工具立即 debugger ,而且跳过了还是会继续,或者是有时候在调试网页时,突然就给你来一个 debugger,接着就是反复来回 debugger 了,贼烦,那今天分享个教程,教大家如何跳过这个 debugger。
sergiojune
2019/09/12
10K0
干货!如何防止别人恶意调试我们的代码
网站如何检测到是否开启开发者工具?这里不是指监听键盘事件F12之类的方法,而是通过浏览器右侧点击打开开发者工具。 现在介绍2个方法,非常管用,可以检测到你是否开启了控制台程序,可以算是JavaScri
前端老道
2022/03/29
1.1K0
前端如何防止数据泄露
最近突然发现了一个好玩的事情,部分网站进去的时候几乎都是死的,那种死是区别于我们常见的网站的死:
shigen
2023/11/13
3360
前端如何防止数据泄露
网页调试之debugger原理与绕过
当我们调试JS的时候,时常会遇见无限debugger。无限debugger的原理是什么呢?它在何时触发?如何绕过?
PayneWu
2021/07/16
9.3K0
网页调试之debugger原理与绕过
Python 爬虫进阶必备 - 以 aqistudy 为例的无限 debugger 反调试绕过演示(附视频)
这样的 debugger ,可以在堆栈里翻看上一层堆栈看看能否置空函数来防止进入 debugger
咸鱼学Python
2021/09/08
1.3K0
Python 爬虫进阶必备 - 以 aqistudy 为例的无限 debugger 反调试绕过演示(附视频)
JS破解--反反调试
今天应小伙伴们意愿写一下过无限 debugger 的两个案例(其实都很简单,只要掌握一两个操作点的话)
Python编程与实战
2019/12/04
4.7K0
用console画条龙?
console一定是各位前端er最熟悉的小伙伴了,无论是console控制台,还是console对象,做前端做久了,打开一个网页总是莫名自然的顺手打开控制台,有些调皮的网站还会故意在控制台输出一些有意思的东西,比如招聘信息,像百度的:
街角小林
2022/06/15
6240
用console画条龙?
用 console 画条龙?
console一定是各位前端er最熟悉的小伙伴了,无论是console控制台,还是console对象,做前端做久了,打开一个网页总是莫名自然的顺手打开控制台,有些调皮的网站还会故意在控制台输出一些有意思的东西,比如招聘信息,像百度的:
winty
2021/07/27
8290
【干货】最全的JavaScript调试技巧总结,必看!
调试技巧,在任何一项技术研发中都可谓是必不可少的技能。掌握各种调试技巧,必定能在编码中起到事半功倍的效果。譬如,快速定位问题、降低故障概率、帮助分析逻辑错误等等。而在互联网前端开发越来越重要的今天,如何在前端开发中降低开发成本,提升工作效率,掌握前端开发调试技巧尤为重要。 老九君今天将为小伙伴们一一讲解各种前端JS调试技巧,也许有的小伙伴们已经熟练掌握,那让我们一起来温习,也许有的小伙伴还没见过这种调试方法,不妨一起来学习,也许有的小伙伴还尚不知如何调试,赶紧趁此机会填补空白。 骨灰级调试大师Alert 那
老九君
2018/03/01
1.9K0
【干货】最全的JavaScript调试技巧总结,必看!
Web前端知识(三)
font-size、font-family、font-style、font-weight
软件小生活
2021/09/10
1.6K0
es6中class类的全方面理解(二)------继承
继承是面向对象中一个比较核心的概念。ES6 class的继承与java的继承大同小异,如果学过java的小伙伴应该很容易理解,都是通过extends关键字继承。相较于ES5当中通过原型链继承要清晰和方便许多。先上代码:
用户1272076
2019/03/26
8370
控制台禁用js_禁止直接访问js
浏览宽高变化监测主要是监测浏览器可视区域的宽高:window.innerWidth / window.innerHeight(滚动条和内容区)和浏览器宽高:window.outerWidth / window.outerHeight(inner的基础上加上工具条的宽高)之间的差值。
全栈程序员站长
2022/11/09
9.9K0
控制台禁用js_禁止直接访问js
11 个 CSS 知识搭配 11 个 JS 特性 (实用合集)
这篇文章我会介绍 11 在开发过程中经常遇到的 CSS 相关知识点,以及 11 个有趣亦实用的 JavaScript 特性。
用户1462769
2019/10/16
9090
防止它人代码调试?分享 1 段优质 JS 代码片段!
这段代码展示了如何使用立即执行函数表达式 (IIFE) 和 setInterval 方法,通过在短时间内持续触发 debugger 语句来迫使调试器频繁中断,从而使调试变得极为困难。
老K博客
2024/06/29
1350
一些你可能不知道的奇葩调试技巧
条件断点是一种高级的调试技巧,它允许我们为某个特定的代码行设置断点,但这个断点只有在满足某个特定条件时才会触发。
ConardLi
2023/12/21
2100
一些你可能不知道的奇葩调试技巧
玩转 Chrome DevTools,定制自己的调试工具
Chrome DevTools 是我们每天都用的工具,它可以查看元素、网络请求、断点调试 JS、分析性能问题等,是辅助开发的利器。
神说要有光zxg
2022/11/11
4K1
玩转 Chrome DevTools,定制自己的调试工具
接口测试平台代码实现56:首页重构-4
本节继续开发首页右侧的显示效果,可能有的同学觉得这里节奏太慢了,不怕,咱养肥再看。
我去热饭
2022/05/19
1.4K0
接口测试平台代码实现56:首页重构-4
相关推荐
前端页面如何禁止别人调试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验