vue项目代码防止被调试-打开控制台直接跳空白页面

news2024/11/22 14:38:14

vue项目代码防止被调试-打开控制台直接跳空白页面

前端代码上线后,代码会暴露,或者接口暴露,会被有心之人研究代码逻辑,找到项目bug漏洞!

项目背景

被安全测试针对了,总是调试我这不太安全的代码。前端代码深度混淆转成十六进制还不行,仍然找到加密方法,对后端数据进行解密。这次就修改了思路换种方法:

我承认阁下很强,但假如, 我是说假如打开控制台是空白页面,阁下又该如何应对呢?

效果:

在这里插入图片描述

解决办法

前端代码防止被调试,无非就是打开控制台,卡住页面不让他往下走。有以下几种办法

1、打开控制台,无限debugger

2、打开控制台,无限加载

3、打开控制台,重定向到新的页面

网上有类似的插件可以使用,推荐两个 disable-devtool、console-ban,我这就是用console-ban内部的js文件做的。

console-ban.min.js 将这个文件放到public文件夹下,然后再index.html文件里引用

/*!
 * console-ban v5.0.0
 * (c) 2020-2023 fz6m
 * Released under the MIT License.
 */
!(function (e, t) {
  typeof exports == 'object' && typeof module != 'undefined'
      ? t(exports)
      : typeof define == 'function' && define.amd
      ? define(['exports'], t)
      : t(((e = typeof globalThis != 'undefined' ? globalThis : e || self).ConsoleBan = {}))
})(this, function (e) {
  'use strict'
  var t = function () {
      return (
          (t =
              Object.assign ||
              function (e) {
                  for (var t, n = 1, i = arguments.length; n < i; n++) {
                      for (var o in (t = arguments[n])) {
                          Object.prototype.hasOwnProperty.call(t, o) && (e[o] = t[o])
                      }
                  }
                  return e
              }),
          t.apply(this, arguments)
      )
  }
  var n = { clear: !0, debug: !0, debugTime: 3e3, bfcache: !0 }
  var i = 2
  var o = function (e) {
      return ~navigator.userAgent.toLowerCase().indexOf(e)
  }
  var r = function (e, t) {
      t !== i ? (location.href = e) : location.replace(e)
  }
  var c = 0
  var a = 0
  var f = function (e) {
      var t = 0
      var n = 1 << c++
      return function () {
          ;(!a || a & n) && ++t === 2 && ((a |= n), e(), (t = 1))
      }
  }
  var s = function (e) {
      var t = /./
      t.toString = f(e)
      var n = function () {
          return t
      }
      n.toString = f(e)
      var i = new Date()
      ;(i.toString = f(e)), console.log('%c', n, n(), i)
      var o
      var r
      var c = f(e)
      ;(o = c),
          (r = new Error()),
          Object.defineProperty(r, 'message', {
              get: function () {
                  o()
              }
          }),
          console.log(r)
  }
  var u = (function () {
      function e(e) {
          var i = t(t({}, n), e)
          var o = i.clear
          var r = i.debug
          var c = i.debugTime
          var a = i.callback
          var f = i.redirect
          var s = i.write
          var u = i.bfcache
          ;(this._debug = r),
              (this._debugTime = c),
              (this._clear = o),
              (this._bfcache = u),
              (this._callback = a),
              (this._redirect = f),
              (this._write = s)
      }
      return (
          (e.prototype.clear = function () {
              this._clear && (console.clear = function () {})
          }),
          (e.prototype.bfcache = function () {
              this._bfcache &&
                  (window.addEventListener('unload', function () {}),
                  window.addEventListener('beforeunload', function () {}))
          }),
          (e.prototype.debug = function () {
              if (this._debug) {
                  var e = new Function('debugger')
                  setInterval(e, this._debugTime)
              }
          }),
          (e.prototype.redirect = function (e) {
              var t = this._redirect
              if (t) {
                  if (t.indexOf('http') !== 0) {
                      var n
                      var i = location.pathname + location.search
                      if (((n = t) ? (n[0] !== '/' ? '/'.concat(n) : n) : '/') !== i) r(t, e)
                  } else location.href !== t && r(t, e)
              }
          }),
          (e.prototype.callback = function () {
              if ((this._callback || this._redirect || this._write) && window) {
                  var e
                  var t = this.fire.bind(this)
                  var n = window.chrome || o('chrome')
                  var r = o('firefox')
                  if (!n) {
                      return r
                          ? (((e = /./).toString = t), void console.log(e))
                          : void (function (e) {
                                var t = new Image()
                                Object.defineProperty(t, 'id', {
                                    get: function () {
                                        e(i)
                                    }
                                }),
                                    console.log(t)
                            })(t)
                  }
                  s(t)
              }
          }),
          (e.prototype.write = function () {
              var e = this._write
              e && (document.body.innerHTML = typeof e == 'string' ? e : e.innerHTML)
          }),
          (e.prototype.fire = function (e) {
              this._callback
                  ? this._callback.call(null)
                  : (this.redirect(e), this._redirect || this.write())
          }),
          (e.prototype.prepare = function () {
              this.clear(), this.bfcache(), this.debug()
          }),
          (e.prototype.ban = function () {
              this.prepare(), this.callback()
          }),
          e
      )
  })()
  e.init = function (e) {
      new u(e).ban()
  }
})

index.html 在index.html内部引入console-ban.min.js

index.html和console-ban.min.js都是同一个public文件夹下

<script src="console-ban.min.js"></script>
 
<% if (process.env.NODE_ENV === 'production' ) { %>
   <script>
        ConsoleBan.init({
            redirect: 'about:blank'
        })
    </script>
<% } %>

在这里插入图片描述

版权声明:本文内容来源CSDN博主「Mr_Debugger」
原文链接:https://blog.csdn.net/chenacxz/article/details/133138162

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识

写这个博客的目的就是我在网上看了半天&#xff0c;发现没有这方面的知识&#xff0c;也许是老手认为这个太简单了&#xff0c;不过我还是告诉新人使用dbeaver来创建一个enum类型的方法&#xff1a; 就是enum("a","b","name") 第一步用dbeaver…

搜索引擎Elasticsearch基础与实践

倒排索引 将文档中的内容分词&#xff0c;然后形成词条。记录每条词条与数据的唯一表示如id的对应关系&#xff0c;形成的产物就是倒排索引&#xff0c;如下图&#xff1a; ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档&#xff08;do…

大语言模型(LLM)综述(七):大语言模型设计应用与未来方向

A Survey of Large Language Models 前言8 A PRACTICAL GUIDEBOOK OF PROMPT DESIGN8.1 提示创建8.2 结果与分析 9 APPLICATIONS10 CONCLUSION AND FUTURE DIRECTIONS 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-…

Mabitys总结

一、ORM ORM(Object/Relation Mapping)&#xff0c;中文名称&#xff1a;对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。 使用JDBC技术时&#xff0c;手动实现ORM映射&#xff1a; 使用ORM时&#xff0c;自动关系映射&#xff1a; &am…

【JavaEE】HTTP协议(什么是HTTP?、HTTP格式、form表单和ajax构造HTTP)

一、什么是HTTP协议&#xff1f; 1.1 HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议 1.2 理解HTTP协议的工作过程 当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就…

FMCW雷达论文速览 | TRS 2023, 基于FMCW雷达的多天线高精度测距算法及性能分析

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TRS 2023 | High Accuracy Multi-antenna Ranging Algorithm and Performance Analysis for FMCW Radar 论文原文:https://ieeexplore.ieee.org/document/10309162 Z. Xu, S. Qi and P. Zh…

Python教程之Python中文件路径

文章目录 前言一、Python中文件路径1.绝对路径和相对路径2.目录中的斜杠们3.正则表达式中的斜杠们 二、什么是文件路径&#xff0c;Python中如何书写文件路径&#xff1f;1.Windows上的反斜杠以及OS X和Linux上的正斜杠关于Python技术储备一、Python所有方向的学习路线二、Pyth…

MS90C385B:+3.3V 150MHz 的 24bit 平板显示器(FPD) LVDS 信号发送器

MS90C385B 芯片能够将 28bit 的 TTL 数据转换成 4 通道的低压差分 信号 (LVDS) 。时钟通道经过锁相之后&#xff0c;与数据通道并行输出。当时钟频 率为 150MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控 制数据以 1050Mbps…

Hadoop常见问题

报错1 &#xff1a;is group-writable, and the group is not root. Its permissions are 0775, datanode启动时&#xff0c;日志报错 1.“xxxx” is group-writable, and the group is not root. Its permissions are 0775, and it is owned by gid 3245. Please fix this…

asp.net core mvc之路由

一、默认路由 &#xff08;Startup.cs文件&#xff09; routes.MapRoute(name: "default",template: "{controllerHome}/{actionIndex}/{id?}" ); 默认访问可以匹配到 https://localhost:44302/home/index/1 https://localhost:44302/home/index https:…

直击第一届中国测绘地理信息大会,华测导航强势出圈!

11月8日&#xff0c;由自然资源部指导&#xff0c;中国测绘学会、中国地理信息产业协会和中国卫星导航定位协会共同主办的第一届中国测绘地理信息大会于浙江德清盛大开幕&#xff0c;各家科研院所、企事业单位云集现场&#xff0c;展示科技创新成果。华测导航携多类智能装备及解…

初步了解OSG智能指针

OSG定义了智能指针模板类ref_ptr<>。 osg命名空间的Referenced类实现了对内存区段的引用计数器功能。 所有的osg节点和场景图形数据&#xff0c;均派生自Referenced类。 ref_ptr<>用于实现一个指向Referenced对象的智能指针。 #include <Geode> #include <…

水泵机组如何通过设备健康管理系统实现预测性维护

水泵机组是关键的工业设备&#xff0c;在正常运行过程中可能遭遇各种故障&#xff0c;影响生产效率和设备寿命。为了提高水泵机组的可靠性和效率&#xff0c;预测性维护成为一种重要的管理方法。本文将介绍水泵机组的结构及常见故障&#xff0c;并详细阐述如何使用设备健康管理…

使用遗传算法优化BP神经网络实现非线性函数拟合

大家好&#xff0c;我是带我去滑雪&#xff01; 非线性函数拟合是一种用于找到与给定数据点集合最好匹配的非线性函数的过程。非线性函数拟合通常用于以下情况&#xff1a; 数据趋势不是线性的&#xff1a;当数据点之间的关系不能用线性方程来表示时&#xff0c;需要使用非线性…

【吞噬星空】斩杀两大兽皇,罗峰实力暴涨,雷神已不是对手

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《吞噬星空》国漫第92话新剧情解析&#xff0c;罗峰、洪和雷神&#xff0c;已成为师兄弟&#xff0c;但洪和雷神无论在实力还是地位上都高于罗峰。因此&#xff0c;罗峰在这三人中始终担…

【C/PTA】循环结构进阶练习(三)

本文结合PTA专项练习带领读者掌握循环结构&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 文章目录 7-1 循环-Fibonacci数列的运算7-2 循环-找数字7-3 循环-小智的捕食计划7-4 循环-抱大腿7-5 循环-跳&#xff01;7-6 循环-生气的峰…

金融帝国实验室(Capitalism Lab)推出一个密钥即完成注册机制!

为了方便趸购『金融帝国实验室』&#xff08;Capitalism Lab&#xff09;正版玩家&#xff0c;Enlight官方正式推出『一个密钥即完成注册』机制&#xff0c;切实简化游戏账户注册流程&#xff01; ————————————— 『一个密钥即完成注册』适用于趸购“游戏本体4DLC”…

前端工程化(vue脚手架安装)

用命令行安装&#xff0c;先安装NodeJs&#xff0c;配置环境变量 1.npm config set prefix "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js" //引号内路径是NodeJs安装所在路径 2.npm config get prefix 查看其是否成功 3.npm install -g vue/cli 4…

Flutter——最详细(AppBar)使用教程

AppBar简介 Material Design 应用栏(标题栏) 使用场景&#xff1a; 顶部标题栏包括一些常用的菜单按钮 属性作用leading左边工具视图automaticallyImplyLeading左边图标的颜色title标题视图actions右边菜单按钮flexibleSpace其高度将与应用栏的整体高度相同bottom左侧底部文本内…

程序员怎样才能学好算法?这本书送几本给大家!

目录 笔者对算法的理解 写书的初衷及过程 本书的内容 购买方式 数据结构和算法是计算机科学的基石&#xff0c;是计算机的灵魂&#xff0c;要想成为计算机专业人员&#xff0c;学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学的很…