V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TaoLoading
V2EX  ›  前端开发

前端如何在不引入库的情况下判断用户打开了 F12 控制台

  •  
  •   TaoLoading ·
    TaoLoading · 241 天前 · 2851 次点击
    这是一个创建于 241 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个需求需要在不引入库的情况下判断用户打开了 F12 控制台,而且要做到多浏览器兼容,大佬们有合适的办法吗

    28 条回复    2024-05-14 15:41:09 +08:00
    gorira
        1
    gorira  
       241 天前   ❤️ 3
    联合十部委出台相关规定,使用控制台查看本站信息违反网络安全法
    Chad0000
        2
    Chad0000  
       241 天前 via iPhone
    玩这种黑魔法没意思,双输。
    JK9993
        3
    JK9993  
       241 天前
    复制一下源码?
    TaoLoading
        4
    TaoLoading  
    OP
       241 天前
    @Chad0000 不是呀,我在做浏览器插件开发,期望当检测到用户开启开发者控制台并选择移动端样式后隐藏我的插件,也是优化用户体验
    zcf0508
        5
    zcf0508  
       241 天前 via Android
    @TaoLoading 那你直接移动端样式兼容就好了,为啥要判断是不是开了控制台
    TaoLoading
        6
    TaoLoading  
    OP
       241 天前
    @zcf0508 因为这个插件是全平台兼容的,也有移动端
    estk
        7
    estk  
       241 天前 via iPhone
    淘宝的 f12 是招聘内容
    Track13
        8
    Track13  
       241 天前 via Android
    不用第三方库你不还是要自己写,有什么区别?
    agagega
        9
    agagega  
       241 天前 via iPhone
    以前在本站看到过一个人贴了个特牛逼的网页,阻止用户打开控制台,标题忘了,可以搜搜
    yhxx
        10
    yhxx  
       241 天前
    不引入库是啥意思
    找个库把它的代码复制一份算引入库吗
    yhxx
        11
    yhxx  
       241 天前
    chrome 可以用这个

    (function () {
    var re = /x/;
    var i = 0;
    console.log(re);

    re.toString = function () {
    return '第 ' + (++i) + ' 次打开控制台';
    };
    })();

    作者:XFD111
    链接: https://www.zhihu.com/question/24188524/answer/117094116
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    TaoLoading
        12
    TaoLoading  
    OP
       241 天前
    @Track13 点就是在这,引入库会让插件变大,性能较差
    TaoLoading
        13
    TaoLoading  
    OP
       241 天前
    @yhxx #11 这种重写 toString() 的方法已经不行了
    Track13
        14
    Track13  
       241 天前 via Android   ❤️ 1
    @TaoLoading 插件大不等于性能差。
    jqtmviyu
        15
    jqtmviyu  
       241 天前   ❤️ 1
    用 debugger 糊弄下吧.

    function check() {
    eval(String.fromCharCode(100, 101, 98, 117, 103, 103, 101, 114, 59))
    setTimeout(check, 1)
    }
    check()
    maplerecall
        16
    maplerecall  
       241 天前   ❤️ 1
    如果只是按你说的需求就简单了,不用整什么花里胡哨的,直接绑 onresize 检查 UA ,如果变成包含 mobile 了就说明切换到手机模拟器了,因为正常情况下 UA 是不会变的。
    ochatokori
        17
    ochatokori  
       241 天前 via Android
    css 媒体查询不就行了,搞这么复杂
    TaoLoading
        18
    TaoLoading  
    OP
       241 天前
    @maplerecall 老哥牛批,原来这时候 UA 也会变,感谢解答
    drymonfidelia
        19
    drymonfidelia  
       241 天前
    @TaoLoading 这种为什么不行,我们公司就在用这种方法,不过不是直接阻止用户操作网页而是往 cookies 里写风控标记
    drymonfidelia
        20
    drymonfidelia  
       241 天前
    @drymonfidelia 19 指 11 楼 @yhxx 那种 toString 的方法
    drymonfidelia
        21
    drymonfidelia  
       241 天前
    @drymonfidelia cookies 的风控标记会在下一个请求被风控系统识别入库,防止单独请求被用户注意到
    drymonfidelia
        22
    drymonfidelia  
       241 天前
    @Chad0000 cloudflare 也在用这种方法写风控标记 turnslite 验证码如果开了控制台 100%不给通过
    bug51
        23
    bug51  
       240 天前
    @jqtmviyu 容易把自己干死 无限 debugger
    TaoLoading
        24
    TaoLoading  
    OP
       239 天前
    @drymonfidelia #20 我试了下新版 chrome 已经不好使了,你那新版 chrome 可以?
    TaoLoading
        25
    TaoLoading  
    OP
       232 天前
    @drymonfidelia #21 你那边 toString() 方法在新版 chrome 好使不,我这测的不行呢
    drymonfidelia
        26
    drymonfidelia  
       232 天前
    @TaoLoading 新版 chrome 确实不好使了,firefox 还可以稳定用,不过我们还有别的方法判断,不好公开
    TaoLoading
        27
    TaoLoading  
    OP
       232 天前
    @drymonfidelia #26 ok ,我试了下可以通过打印大对象数组并计算时间差的方式来判断是否打开了 devtools ,亲测可行
    bronana
        28
    bronana  
       224 天前
    最近在一个盗版资源网站上看到的源码
    ```html
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    </head>
    <body>
    <script>
    /*防扒*/
    (function () {
    var callbacks = [],
    timeLimit = 50,
    open = false;
    setInterval(loop, 1);
    return {
    addListener: function (fn) {
    callbacks.push(fn);
    },
    cancleListenr: function (fn) {
    callbacks = callbacks.filter(function (v) {
    return v !== fn;
    });
    },
    };

    function loop() {
    var startTime = new Date();
    debugger;
    if (new Date() - startTime > timeLimit) {
    if (!open) {
    callbacks.forEach(function (fn) {
    fn.call(null);
    });
    }
    open = true;
    window.stop();
    alert('小黑子,露出鸡脚了吧');
    window.location.reload();
    } else {
    open = false;
    }
    }
    })().addListener(function () {
    window.location.reload();
    });
    </script>
    </body>
    </html>

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3072 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.