diff --git a/f/web-kboss/src/main.js b/f/web-kboss/src/main.js index 504e5c6..5eadf49 100644 --- a/f/web-kboss/src/main.js +++ b/f/web-kboss/src/main.js @@ -138,48 +138,114 @@ if (process.env.NODE_ENV === 'production') { } }); - // 检测开发者工具是否打开 - let lastTime = Date.now(); - function checkDebugger() { - const currentTime = Date.now(); - if (currentTime - lastTime > 100) { - // 如果时间差大于100ms,可能是在调试 - handleDebuggerDetected(); - } - lastTime = currentTime; + // 更准确的开发者工具检测 + let isDevToolsOpened = false; + + // 方法1: 检查开发者工具宽度 + function checkDevToolsByWidth() { + const threshold = 160; // 开发者工具通常至少160px宽 + const widthThreshold = window.outerWidth - window.innerWidth > threshold; + const heightThreshold = window.outerHeight - window.innerHeight > threshold; + + return widthThreshold || heightThreshold; + } + + // 方法2: 检查debugger执行时间(更宽松的阈值) + function checkDevToolsByDebugger() { + return new Promise((resolve) => { + const start = performance.now(); + debugger; + const end = performance.now(); + // 使用更宽松的阈值,避免误报 + resolve(end - start > 200); + }); + } + + // 方法3: 检查控制台是否打开 + function checkDevToolsByConsole() { + const element = new Image(); + Object.defineProperty(element, 'id', { + get: function() { + isDevToolsOpened = true; + } + }); + + console.log(element); + console.clear(); // 清除测试日志 + } + + // 方法4: 检查Eruda等移动端调试工具 + function checkMobileDevTools() { + return !!(window.eruda || window.__eruda || window.vConsole); } // 处理检测到调试器的情况 function handleDebuggerDetected() { - // 可以采取以下措施之一: + if (!isDevToolsOpened) { + isDevToolsOpened = true; - // 1. 显示警告信息(推荐) - alert('检测到开发者工具已打开,为了系统安全,请关闭开发者工具。'); + // 可以选择以下一种或多种处理方式 + // 1. 显示警告信息(推荐) + alert('检测到开发者工具已打开,为了系统安全,请关闭开发者工具。'); - // 2. 跳转到关于页面或其他安全页面 - // window.location.href = '/about'; + // 2. 跳转到关于页面或其他安全页面 + // window.location.href = '/about'; - // 3. 清空敏感数据 - // sessionStorage.clear(); - // localStorage.clear(); + // 3. 清空敏感数据 + // sessionStorage.clear(); + // localStorage.clear(); - // 4. 关闭窗口(慎用) - // window.close(); + // 4. 关闭窗口(慎用) + // window.close(); + + // 5. 禁用页面交互 + // document.body.innerHTML = '

请关闭开发者工具后刷新页面

'; + } } - // 定期检查 - setInterval(function() { - checkDebugger(); - // 使用debugger检测 - (function() { - const startTime = Date.now(); - debugger; - const endTime = Date.now(); - if (endTime - startTime > 100) { + // 定期检查(使用更宽松的间隔) + const checkInterval = setInterval(async function() { + // 如果已经检测到开发工具打开,停止检查 + if (isDevToolsOpened) { + clearInterval(checkInterval); + return; + } + + // 检查移动端调试工具 + if (checkMobileDevTools()) { + handleDebuggerDetected(); + return; + } + + // 检查窗口大小 + if (checkDevToolsByWidth()) { + handleDebuggerDetected(); + return; + } + + // 检查debugger(异步) + const isDebugging = await checkDevToolsByDebugger(); + if (isDebugging) { + handleDebuggerDetected(); + return; + } + + // 偶尔检查控制台(不要太频繁) + if (Math.random() < 0.1) { // 10%的概率检查 + checkDevToolsByConsole(); + } + }, 2000); // 每2秒检查一次,减少性能影响 + + // 监听窗口大小变化(添加去抖) + let resizeTimer; + window.addEventListener('resize', function() { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(function() { + if (checkDevToolsByWidth() && !isDevToolsOpened) { handleDebuggerDetected(); } - })(); - }, 1000); + }, 500); + }); // 禁用控制台输出(可选,根据需求开启) // 注意:这会影响你自己的console.log调试,建议只在生产环境使用 @@ -202,22 +268,6 @@ if (process.env.NODE_ENV === 'production') { }); } - // 检测窗口大小变化(开发者工具打开时窗口大小会变化) - let lastWidth = window.innerWidth; - let lastHeight = window.innerHeight; - - window.addEventListener('resize', function() { - const currentWidth = window.innerWidth; - const currentHeight = window.innerHeight; - - if (Math.abs(currentWidth - lastWidth) > 100 || Math.abs(currentHeight - lastHeight) > 100) { - handleDebuggerDetected(); - } - - lastWidth = currentWidth; - lastHeight = currentHeight; - }); - console.log('防调试保护已启用'); } // ==================== 防 F12 和右键检查功能结束 ====================