Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何防止他人恶意调试你的web程序

如何防止他人恶意调试你的web程序

作者头像
@超人
发布于 2021-09-17 04:07:21
发布于 2021-09-17 04:07:21
1K00
代码可运行
举报
文章被收录于专栏:Vue中文社区Vue中文社区
运行总次数: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-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vue中文社区 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端页面如何禁止别人调试
我们都知道 debugger 在控制台被打开的时候就会执行, 前端页面防止调试的方法主要是通过不断 debugger 来疯狂输出断点,让控制台打开后程序就无法正常执行,以下是一个基本防止调式的代码:
越陌度阡
2022/05/06
1.8K0
前端页面如何禁止别人调试
禁止别人调试自己的前端页面代码
江户川码农
2023/08/01
6660
禁止别人调试自己的前端页面代码
干货!如何防止别人恶意调试我们的代码
网站如何检测到是否开启开发者工具?这里不是指监听键盘事件F12之类的方法,而是通过浏览器右侧点击打开开发者工具。 现在介绍2个方法,非常管用,可以检测到你是否开启了控制台程序,可以算是JavaScri
前端老道
2022/03/29
1.1K0
控制台禁用js_禁止直接访问js
浏览宽高变化监测主要是监测浏览器可视区域的宽高:window.innerWidth / window.innerHeight(滚动条和内容区)和浏览器宽高:window.outerWidth / window.outerHeight(inner的基础上加上工具条的宽高)之间的差值。
全栈程序员站长
2022/11/09
9.9K0
控制台禁用js_禁止直接访问js
突破前端反调试--阻止页面不断debugger
不知道你们有没有遇到过上图这样,有时候想调试网站,一打开开发者工具立即 debugger ,而且跳过了还是会继续,或者是有时候在调试网页时,突然就给你来一个 debugger,接着就是反复来回 debugger 了,贼烦,那今天分享个教程,教大家如何跳过这个 debugger。
sergiojune
2019/09/12
10K0
【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
K哥爬虫
2021/12/09
3.2K1
【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
使用断点调试代码「建议收藏」
简单地说,断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。
全栈程序员站长
2022/08/26
1.4K0
使用断点调试代码「建议收藏」
防止页面被调试
使用的时候,可以将js方法压缩  http://tool.chinaz.com/js.aspx
用户1518699
2019/07/11
1.1K0
一些你可能不知道的奇葩调试技巧
条件断点是一种高级的调试技巧,它允许我们为某个特定的代码行设置断点,但这个断点只有在满足某个特定条件时才会触发。
ConardLi
2023/12/21
2100
一些你可能不知道的奇葩调试技巧
你会在浏览器中打断点吗?我会!
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。
前端柒八九
2023/12/04
6510
你会在浏览器中打断点吗?我会!
前端如何防止数据泄露
最近突然发现了一个好玩的事情,部分网站进去的时候几乎都是死的,那种死是区别于我们常见的网站的死:
shigen
2023/11/13
3360
前端如何防止数据泄露
【JS 逆向百例】网洛者反爬练习平台第七题:JSVMPZL 初体验
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请在公众号联系我立即删除!
K哥爬虫
2022/03/29
4920
【JS 逆向百例】网洛者反爬练习平台第七题:JSVMPZL 初体验
Web Spider案例 网洛者 第一题 JS混淆加密 - 反hook操作 练习(五)
Web Spider Fiddler - JS Hook 基本使用:https://blog.csdn.net/EXIxiaozhou/article/details/128794705 网洛者 - 反反爬虫训练平台网址:https://wangluozhe.com/
EXI-小洲
2023/03/01
8541
Web Spider案例 网洛者 第一题 JS混淆加密 - 反hook操作 练习(五)
Chrome 调试技巧
想必大家都在用console.log在控制台输出点东西,其实console还有其它的方法:
前端教程
2018/10/25
2.4K0
Chrome 调试技巧
pycharm如何调试代码_pycharm怎么分段运行代码
  (2)已经创建了一个python工程并且添加了内容,具体参考: Getting Started tutorial
全栈程序员站长
2022/09/27
2.3K0
pycharm如何调试代码_pycharm怎么分段运行代码
网页调试之debugger原理与绕过
当我们调试JS的时候,时常会遇见无限debugger。无限debugger的原理是什么呢?它在何时触发?如何绕过?
PayneWu
2021/07/16
9.3K0
网页调试之debugger原理与绕过
大型前端项目的断点调试共享化和复用化实践
作者:enoyao,腾讯工程师 背景 随着我们项目越来越大,我们有可能需要维护很多的模块,我们腾讯文档 Excel 项目大模块有 10 几个,而每个大模块分别有 N 个小模块,每个大模块下的小模块都有主要的负责人在跟进模块问题。 这就会导致一个很大的问题是,模块负责人大部分情况只会关注自己模块的问题,而不甚了解其他负责人手上模块的具体问题。 比如:当我们有用户反馈使用复制粘贴有问题的时候,我们想要快速去定位这个问题,就只能找复制粘贴对应的模块负责人处理,如果复制粘贴模块负责人请假了,那么其他负责人
腾讯技术工程官方号
2020/10/10
8522
玩转 Chrome DevTools,定制自己的调试工具
Chrome DevTools 是我们每天都用的工具,它可以查看元素、网络请求、断点调试 JS、分析性能问题等,是辅助开发的利器。
神说要有光zxg
2022/11/11
4K1
玩转 Chrome DevTools,定制自己的调试工具
基于Chrome扩展的浏览器可信事件与网页离线PDF导出
Chrome扩展是一种可以在浏览器中添加新功能和修改浏览器行为的软件程序,我们可以基于Manifest规范的API实现对于浏览器和Web页面在一定程度上的修改,例如广告拦截、代理控制等。Chrome DevTools Protocol则是Chrome浏览器提供的一套与浏览器进行交互的API,我们可以基于DevTools协议控制Chromium内核的浏览器进行各种操作,例如操作页面元素、模拟用户交互等。
WindRunnerMax
2024/07/03
1850
【JS逆向百例】某江 Hospital 逆向分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2024/12/30
1250
【JS逆向百例】某江 Hospital 逆向分析
推荐阅读
相关推荐
前端页面如何禁止别人调试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验