feat: 0.0.3,修复alert等方法和切后台导致的bug,兼容IE等

This commit is contained in:
theajack 2020-10-25 17:14:50 +08:00
parent 9f814a1849
commit 04d2a4ff87
21 changed files with 233 additions and 55 deletions

View File

@ -4,7 +4,8 @@
{
"useBuiltIns": "entry",
"targets": {
"esmodules": true
"esmodules": true,
"ie": 11
}
}
]],

View File

@ -1,4 +1,5 @@
/public/bundle.js
/public/index.html
/npm
/cdn
/cdn
**/*.html

View File

@ -20,7 +20,7 @@
<a href="https://www.github.com/theajack/disable-devtool"><img src="https://img.shields.io/librariesio/dependent-repos/npm/disable-devtool.svg" alt="Dependent"></a>
</p>
**[English](https://github.com/theajack/disable-devtool/blob/master/helper/README.en.md) | <a target="view_window" href="https://theajack.gitee.io/disable-devtool">在线试用/文档</a> | [Gitee](https://gitee.com/theajack/disable-devtool)**
**[English](https://github.com/theajack/disable-devtool/blob/master/README.md) | [在线试用/文档](https://theajack.gitee.io/disable-devtool) | [更新日志](https://github.com/theajack/disable-devtool/blob/master/helper/version.md) | [Gitee](https://gitee.com/theajack/disable-devtool)**
## 1. 快速使用
@ -52,10 +52,11 @@ disable-devtool 可以禁用所有一切可以进入开发者工具的方法,
2. 禁用 f12 和 ctrl+shift+i 快捷键
3. 支持识别从浏览器菜单栏打开开发者工具并关闭当前页面
4. 开发者可以绕过禁用 (url参数使用tk配合md5加密)
5. 支持几乎所有浏览器
5. 支持几乎所有浏览器包含IE
6. 高度可配置
7. 使用极简、体积小巧 (仅6kb)
8. 支持npm引用和script标签引用(属性配置)
9. 识别真移动端与浏览器开发者工具设置插件伪造的移动端,为移动端节省性能
## 3. 使用
@ -84,9 +85,12 @@ declare interface optionStatic {
debugDelay?: number; // debug模式时的延迟 默认200ms
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true
stopIntervalTime?: number; // 在移动端时取消监视的等待时长
}
```
备注disableMenu参数在ie下无效因为ie下右键会阻塞主进程且无法监听
### 3.2 md5 与 tk 绕过禁用
该库中使用 key 与 md5 配合的方式使得开发者可以在线上绕过禁用。

View File

@ -19,7 +19,7 @@
<a href="https://www.github.com/theajack/disable-devtool"><img src="https://img.shields.io/librariesio/dependent-repos/npm/disable-devtool.svg" alt="Dependent"></a>
</p>
**[中文](https://github.com/theajack/disable-devtool/blob/master/README.cn.md) | <a target="view_window" href="https://theajack.gitee.io/disable-devtool">online trial/document</a> | [Gitee](https://gitee.com/theajack/disable-devtool)**
**[中文](https://github.com/theajack/disable-devtool/blob/master/README.cn.md) | [online trial/document](https://theajack.gitee.io/disable-devtool) | [Version Log](https://github.com/theajack/disable-devtool/blob/master/helper/version.md) | [Gitee](https://gitee.com/theajack/disable-devtool)**
## 1. Quick use
@ -51,10 +51,11 @@ The library has the following features:
2. Disable f12 and ctrl+shift+i shortcuts
3. Support recognition to open the developer tools from the browser menu bar and close the current page
4. Developers can bypass the disablement (use tk and md5 encryption for url parameters)
5. Support almost all browsers
5. Support almost all browsers (Include IE)
6. Highly configurable
7. Minimal use, small size (only 6kb)
8. Support npm reference and script tag reference (attribute configuration)
9. Identify the real mobile terminal and browser developer tool settings plug-in forged mobile terminal, saving performance for the mobile terminal
## 3. Use
@ -83,9 +84,12 @@ declare interface optionStatic {
debugDelay?: number; // The delay in debug mode is 200ms by default
interval?: number; // Timer interval is 200ms by default
disableMenu?: boolean; // Whether to disable the right-click menu The default is true
stopIntervalTime?: number; // Waiting time to cancel monitoring on mobile
}
```
Note: The disableMenu parameter is invalid under ie, because the right button under ie will block the main process and cannot monitor
### 3.2 md5 and tk bypass disable
The combination of key and md5 in the library allows developers to bypass the disabling online.

13
helper/mod-minjs.js Normal file
View File

@ -0,0 +1,13 @@
const util = require('./util');
function main () {
var file = 'npm/disable-devtool.min.js';
util.read(file, (code) => {
util.write(file, code.replace(/[a-z]\){/i, (str) => {
let n = str[0];
return `${str}var _f=${n};${n}=function(){return _f().default};`;
}));
});
}
main();

15
helper/testcdn.html Normal file
View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Disable Devtool Demo</title>
</head>
<body>
<script id='disable-devtool'
md5='d4de605ccb923b7e876b3218a1474653'
tk-name='tk'
src="../npm/disable-devtool.min.js"></script>
</body>
</html>

View File

@ -1,6 +1,13 @@
let fs = require('fs');
module.exports = {
read: function (file, cb) {
fs.readFile(file, 'utf8', (err, code) => {
if (err) throw err;
cb(code);
});
},
write: function (file, txt, cb) {
fs.writeFile(file, txt, 'utf8', (err) => {
if (err) throw err;

21
helper/version.md Normal file
View File

@ -0,0 +1,21 @@
# Version Log:
## 0.0.1
1. 支持可配置是否禁用右键菜单
2. 禁用 f12 和 ctrl+shift+i 快捷键
3. 支持识别从浏览器菜单栏打开开发者工具并关闭当前页面
4. 开发者可以绕过禁用 (url参数使用tk配合md5加密)
5. 支持几乎所有浏览器
6. 高度可配置
7. 使用极简、体积小巧 (仅6kb)
8. 支持npm引用和script标签引用(属性配置)
## 0.0.2
1. 解决cdn文件无效的bug
## 0.0.3
1. 解决alert等原生方法会影响debug计时导致
2. 解决页面且后台会影响debug计时导致
3. 兼容iedisableMenu参数在ie下无效因为ie下右键会阻塞主进程且无法监听
4. 增加config.stopIntervalTime 表示在移动端时取消监视的等待时长
5. 优化判断开发者工具打开的逻辑

View File

@ -20,7 +20,7 @@
<a href="https://www.github.com/theajack/disable-devtool"><img src="https://img.shields.io/librariesio/dependent-repos/npm/disable-devtool.svg" alt="Dependent"></a>
</p>
**[English](https://github.com/theajack/disable-devtool/blob/master/helper/README.en.md) | [在线试用/文档](https://theajack.gitee.io/disable-devtool) | [Gitee](https://gitee.com/theajack/disable-devtool)**
**[English](https://github.com/theajack/disable-devtool/blob/master/README.md) | [在线试用/文档](https://theajack.gitee.io/disable-devtool) | [更新日志](https://github.com/theajack/disable-devtool/blob/master/helper/version.md) | [Gitee](https://gitee.com/theajack/disable-devtool)**
## 1. 快速使用
@ -52,10 +52,11 @@ disable-devtool 可以禁用所有一切可以进入开发者工具的方法,
2. 禁用 f12 和 ctrl+shift+i 快捷键
3. 支持识别从浏览器菜单栏打开开发者工具并关闭当前页面
4. 开发者可以绕过禁用 (url参数使用tk配合md5加密)
5. 支持几乎所有浏览器
5. 支持几乎所有浏览器包含IE
6. 高度可配置
7. 使用极简、体积小巧 (仅6kb)
8. 支持npm引用和script标签引用(属性配置)
9. 识别真移动端与浏览器开发者工具设置插件伪造的移动端,为移动端节省性能
## 3. 使用
@ -84,9 +85,12 @@ declare interface optionStatic {
debugDelay?: number; // debug模式时的延迟 默认200ms
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true
stopIntervalTime?: number; // 在移动端时取消监视的等待时长
}
```
备注disableMenu参数在ie下无效因为ie下右键会阻塞主进程且无法监听
### 3.2 md5 与 tk 绕过禁用
该库中使用 key 与 md5 配合的方式使得开发者可以在线上绕过禁用。

View File

@ -19,7 +19,7 @@
<a href="https://www.github.com/theajack/disable-devtool"><img src="https://img.shields.io/librariesio/dependent-repos/npm/disable-devtool.svg" alt="Dependent"></a>
</p>
**[中文](https://github.com/theajack/disable-devtool/blob/master/README.cn.md) | [online trial/document](https://theajack.gitee.io/disable-devtool) | [Gitee](https://gitee.com/theajack/disable-devtool)**
**[中文](https://github.com/theajack/disable-devtool/blob/master/README.cn.md) | [online trial/document](https://theajack.gitee.io/disable-devtool) | [Version Log](https://github.com/theajack/disable-devtool/blob/master/helper/version.md) | [Gitee](https://gitee.com/theajack/disable-devtool)**
## 1. Quick use
@ -51,10 +51,11 @@ The library has the following features:
2. Disable f12 and ctrl+shift+i shortcuts
3. Support recognition to open the developer tools from the browser menu bar and close the current page
4. Developers can bypass the disablement (use tk and md5 encryption for url parameters)
5. Support almost all browsers
5. Support almost all browsers (Include IE)
6. Highly configurable
7. Minimal use, small size (only 6kb)
8. Support npm reference and script tag reference (attribute configuration)
9. Identify the real mobile terminal and browser developer tool settings plug-in forged mobile terminal, saving performance for the mobile terminal
## 3. Use
@ -83,9 +84,12 @@ declare interface optionStatic {
debugDelay?: number; // The delay in debug mode is 200ms by default
interval?: number; // Timer interval is 200ms by default
disableMenu?: boolean; // Whether to disable the right-click menu The default is true
stopIntervalTime?: number; // Waiting time to cancel monitoring on mobile
}
```
Note: The disableMenu parameter is invalid under ie, because the right button under ie will block the main process and cannot monitor
### 3.2 md5 and tk bypass disable
The combination of key and md5 in the library allows developers to bypass the disabling online.

File diff suppressed because one or more lines are too long

15
npm/index.d.ts vendored
View File

@ -1,11 +1,12 @@
declare interface optionStatic {
md5?: string;
url?: string;
tkName?: string;
ondevtoolopen?(): void; // ondevtoolopen 优先级高于 url
debugDelay?: number;
interval?: number;
disableMenu?: boolean;
md5?: string; // 绕过禁用的md5值详情见3.2,默认不启用绕过禁用
url?: string; // 关闭页面失败时的跳转页面默认值为localhost
tkName?: string; // 绕过禁用时的url参数名称默认为 ddtk
ondevtoolopen?(): void; // 开发者面板打开的回调启用时url参数无效
debugDelay?: number; // debug模式时的延迟 默认200ms
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true ie下无效
stopIntervalTime?: number; // 在移动端时取消监视的等待时长
}
declare interface DDTStatic {
(option?: optionStatic): void;

View File

@ -1,12 +1,12 @@
{
"name": "disable-devtool",
"version": "0.0.2",
"version": "0.0.3",
"description": "Disable web developer tools from the f12 button, right-click and browser ",
"main": "disable-devtool.min.js",
"scripts": {
"dev": "webpack-dev-server --open --config webpack-config/dev.js",
"start": "npm run dev",
"build": "webpack --config webpack-config/build.js",
"build": "webpack --config webpack-config/build.js && node helper/mod-minjs.js",
"publish": "npm publish npm",
"lint": "eslint src --ext js"
},

View File

@ -1,6 +1,6 @@
{
"name": "disable-devtool",
"version": "0.0.1",
"version": "0.0.3",
"description": "Disable web developer tools from the f12 button, right-click and browser ",
"main": "disable-devtool.min.js",
"unpkg": "disable-devtool.min.js",
@ -13,7 +13,7 @@
"scripts": {
"dev": "webpack-dev-server --open --config webpack-config/dev.js",
"start": "npm run dev",
"build": "webpack --config webpack-config/build.js",
"build": "webpack --config webpack-config/build.js && node helper/mod-minjs.js",
"publish": "npm publish npm",
"lint": "eslint src --ext js"
},

View File

@ -4,8 +4,9 @@ import disableDevtool from '../src';
disableDevtool({
md5: 'd4de605ccb923b7e876b3218a1474653',
// url: 'https://www.qq.com',
ondevtoolopen: () => {
// window.location.href = 'https://www.qq.com';
},
// ondevtoolopen: () => {
// window.location.href = 'https://www.qq.com';
// },
interval: 1000,
tkName: 'xx',
});

View File

@ -3,11 +3,12 @@ import {closeWindow} from './util';
export let config = {
md5: '',
ondevtoolopen: closeWindow, // ondevtoolopen 优先级高于 url
url: 'http://localhost',
url: '',
tkName: 'ddtk',
debugDelay: 200,
interval: 200,
disableMenu: true
disableMenu: true, // 该参数ie下无效ie 右键菜单会阻塞线程影响debug延迟计算 禁用右键菜单
stopIntervalTime: 5000, // 在移动端时取消监视的等待时长
};
export function mergeConfig (opts = {}) {

15
src/index.d.ts vendored
View File

@ -1,11 +1,12 @@
declare interface optionStatic {
md5?: string;
url?: string;
tkName?: string;
ondevtoolopen?(): void; // ondevtoolopen 优先级高于 url
debugDelay?: number;
interval?: number;
disableMenu?: boolean;
md5?: string; // 绕过禁用的md5值详情见3.2,默认不启用绕过禁用
url?: string; // 关闭页面失败时的跳转页面默认值为localhost
tkName?: string; // 绕过禁用时的url参数名称默认为 ddtk
ondevtoolopen?(): void; // 开发者面板打开的回调启用时url参数无效
debugDelay?: number; // debug模式时的延迟 默认200ms
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true ie下无效
stopIntervalTime?: number; // 在移动端时取消监视的等待时长
}
declare interface DDTStatic {
(option?: optionStatic): void;

View File

@ -1,11 +1,19 @@
import {config} from './config';
import {isPC} from './util';
import {hackAlert, isPC, onPageShowHide} from './util';
let interval = null, timer = null;
let calls = [];
export function initInterval () {
let _pause = false;
let pause = () => {_pause = true;};
let goon = () => {_pause = false;};
hackAlert(pause, goon); // 防止 alert等方法触发了debug延迟计算
onPageShowHide(goon, pause); // 防止切后台触发了debug延迟计算
interval = window.setInterval(() => {
console.log(1);
if (_pause) return;
calls.forEach(fn => {fn();});
}, config.interval);
// 两秒之后判断 如果不是pc去掉定时器interval为了优化移动端的性能
@ -14,7 +22,7 @@ export function initInterval () {
if (!isPC()) {
clearInterval();
}
}, 2000);
}, config.stopIntervalTime);
}
export function registInterval (fn) {

View File

@ -1,16 +1,23 @@
import {config} from './config';
import {isIE} from './util';
export function disableKeyAndMenu () {
window.addEventListener('keydown', (e) => {
if (e.keyCode === 123 || (e.shiftKey && e.ctrlKey && e.keyCode === 73)) {
e = e || window.event;
let keyCode = e.keyCode || e.which;
// alert(e.keyCode);
if (keyCode === 123 || (e.shiftKey && e.ctrlKey && e.keyCode === 73)) {
e.returnValue = false;
e.preventDefault();
return false;
}
});
if (config.disableMenu) {
}, false);
if (config.disableMenu || isIE()) { // ie 右键菜单会阻塞线程影响debug延迟计算 禁用右键菜单
window.addEventListener('contextmenu', (e) => {
e = e || window.event;
e.returnValue = false;
e.preventDefault();
return false;
});
}, false);
}
}

View File

@ -6,9 +6,7 @@ import md5 from './md5';
export function disableDevtool (opts) {
mergeConfig(opts);
if (checkTk()) {
return;
}
if (checkTk()) {return;}
initInterval();
disableKeyAndMenu();
initDevTool();
@ -32,17 +30,19 @@ function checkTk () {
return false;
}
let disableDebug = false; // 当 initDevTool 方式生效时去除debug断点
function initDebugger () {
let fn = new Function('debugger');
let last = getNowTime();
let debug = new Function('debugger');
registInterval(() => {
fn();
let now = getNowTime();
if (disableDebug) {
return;
}
var last = getNowTime();
debug();
// interval 时间是 config.interval设置config.debugDelay是为了给一个执行的时间
if (now - last > config.interval + config.debugDelay) {
if (getNowTime() - last > config.interval + config.debugDelay) {
onDevToolOpen();
} else {
last = now;
}
});
}
@ -53,11 +53,13 @@ function initDevTool () {
if (isFF) {
toTest = /./;
toTest.toString = function () {
disableDebug = true;
onDevToolOpen();
};
} else {
toTest = new Image();
toTest.__defineGetter__('id', function () {
disableDebug = true;
onDevToolOpen();
});
}
@ -87,5 +89,4 @@ function checkScriptUse () {
disableDevtool(json);
}
checkScriptUse();

View File

@ -6,11 +6,18 @@ export function isPC () {
export function closeWindow () {
// 需要是有js跳转到这个页面才可以关闭这个页面
window.opener = null;
window.open('', '_self');
window.close();
if (config.url) {
window.location.href = config.url;
} else {
window.opener = null;
window.open('', '_self');
window.close();
window.history.back();
setTimeout(() => {
window.location.href = 'http://localhost';
}, 100);
}
// 否则执行跳转到 url
window.location.href = config.url;
}
export function getNowTime () {
@ -45,4 +52,81 @@ export function formatName (name) {
}
return c;
}).join('');
}
export function onPageShowHide (onshow, onhide) {
var hidden, state, visibilityChange;
if (typeof document.hidden !== 'undefined') {
hidden = 'hidden';
visibilityChange = 'visibilitychange';
state = 'visibilityState';
} else if (typeof document.mozHidden !== 'undefined') {
hidden = 'mozHidden';
visibilityChange = 'mozvisibilitychange';
state = 'mozVisibilityState';
} else if (typeof document.msHidden !== 'undefined') {
hidden = 'msHidden';
visibilityChange = 'msvisibilitychange';
state = 'msVisibilityState';
} else if (typeof document.webkitHidden !== 'undefined') {
hidden = 'webkitHidden';
visibilityChange = 'webkitvisibilitychange';
state = 'webkitVisibilityState';
}
var cb = function () {
if (document[state] === hidden) {
onhide();
} else {
onshow();
}
};
document.removeEventListener(visibilityChange, cb, false);
document.addEventListener(visibilityChange, cb, false);
}
export function hackAlert (before, after) {
let _alert = window.alert;
let _confirm = window.confirm;
let _prompt = window.prompt;
let mod = (fn) => {
return (...args) => {
if (before) {before();}
fn(...args);
if (after) {after();}
};
};
window.alert = mod(_alert);
window.confirm = mod(_confirm);
window.prompt = mod(_prompt);
}
export function isIE () {
var userAgent = navigator.userAgent; // 取得浏览器的userAgent字符串
var isIE = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1; // 判断是否IE<11浏览器
var isEdge = userAgent.indexOf('Edge') > -1 && !isIE; // 判断是否IE的Edge浏览器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;
return isIE || isEdge || isIE11;
// if (isIE) {
// var reIE = new RegExp('MSIE (\\d+\\.\\d+);');
// reIE.test(userAgent);
// var fIEVersion = parseFloat(RegExp['$1']);
// if (fIEVersion == 7) {
// return 7;
// } else if (fIEVersion == 8) {
// return 8;
// } else if (fIEVersion == 9) {
// return 9;
// } else if (fIEVersion == 10) {
// return 10;
// } else {
// return 6;// IE版本<=7
// }
// } else if (isEdge) {
// return 'edge';// edge
// } else if (isIE11) {
// return 11; // IE11
// } else {
// return -1;// 不是ie浏览器
// }
}