使用React自定义Hook保护登录页面:禁用开发者工具

在Web开发中,有时我们需要保护敏感页面(如登录页)免受开发者工具的干扰。本文将介绍如何创建一个React自定义Hook来实现这一功能。

技术栈:react vite

disableDevTools函数详解

这个函数实现了多种防护措施:

TypeScript 复制代码
export function disableDevTools() {
  // 阻止右键菜单
  const blockContextMenu = (e) => {
    e.preventDefault();
    return false;
  };

  // 阻止快捷键打开开发者工具
  const blockKeyDown = (e) => {
    if (
      e.key === "F12" ||
      (e.ctrlKey && e.shiftKey && e.key === "I") ||
      (e.ctrlKey && e.shiftKey && e.key === "J") ||
      (e.ctrlKey && e.key === "U")
    ) {
      e.preventDefault();
      return false;
    }
  };

  // 添加事件监听
  document.addEventListener("contextmenu", blockContextMenu);
  document.addEventListener("keydown", blockKeyDown);

  // 定期检查开发者工具是否打开
  let devToolsOpened = false;
  const checkInterval = setInterval(() => {
    const widthThreshold = window.outerWidth - window.innerWidth > 160;
    const heightThreshold = window.outerHeight - window.innerHeight > 160;
    if ((widthThreshold || heightThreshold) && !devToolsOpened) {
      devToolsOpened = true;
      window.location.reload();
    }
  }, 1000);

//return 的清理函数不会在赋值时自动执行,必须显式调用(如 cleanup())或由框架(React/Vue)自动调用。
  // 返回清理函数
  return () => {
    document.removeEventListener("contextmenu", blockContextMenu);
    document.removeEventListener("keydown", blockKeyDown);
    clearInterval(checkInterval);
  };
}

useDisableDevTools Hook详解

这个自定义Hook将上述功能集成到React组件中:

TypeScript 复制代码
import { useEffect } from "react";
import { useLocation } from "react-router-dom";
import { disableDevTools } from "@/utils/nocheck";

function useDisableDevTools() {
  const location = useLocation();

  useEffect(() => {
    if (
      location.pathname.includes("login") &&
      import.meta.env.VITE_DEVTOOLS_OPEN === "true"
    ) {
      const clean = disableDevTools();
      return clean;
    }
  }, [location.pathname]);
}

export default useDisableDevTools;

功能特点

  1. 右键菜单禁用:阻止用户通过右键菜单打开开发者工具

  2. 快捷键拦截:拦截F12、Ctrl+Shift+I、Ctrl+Shift+J、Ctrl+U等常用开发者工具快捷键

  3. 窗口大小检测:通过比较内外窗口大小差异检测开发者工具是否打开

  4. 自动清理:使用React的useEffect清理机制确保资源释放

使用场景

这个Hook特别适合用于:

  • 登录页面保护

  • 敏感操作页面

  • 防止用户篡改页面内容

    使用方法

    在需要保护的组件中引入并使用:

    javascript 复制代码
     import useDisableDevTools from "@/hooks/useDisableDevTools";
    ​function LoginPage() {
      useDisableDevTools();  
      // ...页面其他逻辑
    }

    注意事项

  • 这种保护措施不能完全阻止技术娴熟的用户访问开发者工具

  • 可能会影响用户体验,应谨慎使用

  • 在生产环境中使用时,建议结合其他安全措施

  • 通过环境变量控制是否启用,便于开发调试

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__4 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.4 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~5 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子8 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni9 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端