使用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();  
      // ...页面其他逻辑
    }

    注意事项

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

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

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

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

相关推荐
vipbic26 分钟前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy32 分钟前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志1 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble2 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯3 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜4 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司4 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
江华森4 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http
IT_陈寒5 小时前
Redis的KEYS命令把我搞崩溃了,改用SCAN才活过来
前端·人工智能·后端
Jackson__5 小时前
为什么 Agent 越聊越慢?聊聊 Context(上下文)管理
前端·agent·ai编程