V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
dyxang
V2EX  ›  JavaScript

如何用 js 阻止网页中某网址的加载

  •  
  •   dyxang · 2020-04-21 00:21:51 +08:00 via Android · 4571 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己博客插入一段开源项目的 js,每次访问页面的时候都会请求 hm.baidu.com ,估计是开发者统计数据,但是我又不想让它访问。如何做到阻止?
    第 1 条附言  ·  2020-04-21 01:21:29 +08:00
    算了……就让他统计吧……反正个人博客没什么值得统计的……
    第 2 条附言  ·  2020-04-21 02:47:20 +08:00
    放上来吧:
    涉及到的项目

    Valine“一款快速、简洁且高效的无后端评论系统” valine.js.org
    开发者在目前最新版本 1.4.4 中加入了统计代码(控制台亲测),我已用回旧版本 1.3.1
    33 条回复    2020-04-23 10:17:35 +08:00
    Jackwolf
        1
    Jackwolf  
       2020-04-21 00:27:54 +08:00 via iPhone
    先确认是否是自己浏览器的锅

    换台电脑的试试看
    dyxang
        2
    dyxang  
    OP
       2020-04-21 00:29:25 +08:00 via Android
    @Jackwolf 我是安装了 ublock 才看到 hm.baidu.com block by cilent
    dyxang
        3
    dyxang  
    OP
       2020-04-21 00:30:17 +08:00 via Android
    @Jackwolf 控制台看到的,但我又不想让自己网页挂上了别人的统计…
    dyxang
        4
    dyxang  
    OP
       2020-04-21 00:31:20 +08:00 via Android
    @Jackwolf 啊发快了,控制台看到发起程序链就是由这个开源项目的 js 发起的
    Elissa
        5
    Elissa  
       2020-04-21 00:39:05 +08:00
    检查博客的插件、主题、模板是否含有统计链接
    dyxang
        6
    dyxang  
    OP
       2020-04-21 00:49:58 +08:00 via Android
    @Elissa 静态的,貌似是这个项目的开发者在 js 藏了一段请求
    foru17
        7
    foru17  
       2020-04-21 00:51:21 +08:00
    adguard home 或者 pihole
    serenader
        8
    serenader  
       2020-04-21 01:08:29 +08:00   ❤️ 2
    配置 CSP 头,浏览器就能帮你拦截掉。
    iNaru
        9
    iNaru  
       2020-04-21 01:16:03 +08:00   ❤️ 1
    如果这个统计请求是通过 document.createElement 的方式加载的话,
    即:
    ae01.alicdn.com/kf/U2a301ed880ae4b0c9deb1b8a7d85ea34z.jpg

    可以用以下这样阻止加载(抄袭自 uBO github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/assets/resources/scriptlets.js#L35 )。
    该代码必须在统计代码前运行。

    paste.ubuntu.com/p/HQFkzzrq3Q/
    dyxang
        10
    dyxang  
    OP
       2020-04-21 01:20:45 +08:00 via Android
    @foru17
    我的意思是不要访问页面的人被统计代码给统计到,而不是不要我访问页面被统计到,页面(博客)是我的😂
    @serenader
    ysc3839
        11
    ysc3839  
       2020-04-21 01:45:45 +08:00
    既然是开源项目,自己去掉这段统计就好了吧?
    另外说说是什么项目?
    eason1874
        12
    eason1874  
       2020-04-21 02:43:00 +08:00   ❤️ 1
    我想到的几个方法。

    一是直接找到开源 JS 里的统计代码删掉,或者把 ID 改成你自己的 ID 。

    二是跟 #8 说的一样,通过 Content-Security-Policy 限制资源域名,不让加载百度统计域名的资源,这样就统计不了了,但是这样你自己也用不了百度统计了,而且这个对浏览器版本有一定要求,老的不支持。

    三是提前把百度统计使用的设置变量 _hmt 设置成你自己的参数,并且通过 Object.freeze 锁定,不让修改,这样统计就统计到你自己的账号了。我感觉可行,不过我没试过。
    dyxang
        13
    dyxang  
    OP
       2020-04-21 02:43:10 +08:00 via Android
    @ysc3839 就是去不掉才没辙问 V2EX 啊
    valine,评论系统,目前最新 1.4.4
    autoxbc
        14
    autoxbc  
       2020-04-21 02:44:47 +08:00   ❤️ 2
    CSP 可以做到,或者给全局对象 XMLHttpRequest 和 fetch 套一层判断函数
    dyxang
        15
    dyxang  
    OP
       2020-04-21 02:47:38 +08:00 via Android
    @autoxbc 静态博客……
    dyxang
        16
    dyxang  
    OP
       2020-04-21 02:51:20 +08:00 via Android
    @autoxbc 啊不好意思,犯了望文生义的错了,以为是动态博客和服务器才能做的
    ysc3839
        17
    ysc3839  
       2020-04-21 05:04:12 +08:00
    @dyxang 搜索 hm.baidu.com 能找到相关代码,删除即可。
    ysc3839
        18
    ysc3839  
       2020-04-21 05:10:04 +08:00
    zhw2590582
        19
    zhw2590582  
       2020-04-21 08:59:21 +08:00   ❤️ 1
    统计原理是发起有个 img 的 http 请求,语法是 var img = new Image; img.src='baidu.com';
    那样的话,我可以在这个脚本加载前,重定义构造函数 Image,当实例的 src 等于 baidu.com 就直接返回就可以了。
    kingcc
        20
    kingcc  
       2020-04-21 09:11:58 +08:00 via Android
    service worker
    foxt8
        21
    foxt8  
       2020-04-21 09:25:53 +08:00
    同用 Vline,没有遇到这个问题?
    Latin
        22
    Latin  
       2020-04-21 09:43:55 +08:00
    hosts
    0.0.0.0 hm.baidu.com
    openmynet
        23
    openmynet  
       2020-04-21 10:16:18 +08:00   ❤️ 1
    代码在这:
    var descriptor = Object.getOwnPropertyDescriptor(
    HTMLScriptElement.prototype,
    "src"
    );
    Object.defineProperty(HTMLScriptElement.prototype, "source", descriptor);

    Object.defineProperty(HTMLScriptElement.prototype, "src", {
    get: function() {
    return this.source;
    },
    set: function(v) {
    if (/baidu.com/.test(v)) {
    throw("block")
    }
    this.source = v;
    }
    });

    #可以拓展为反网页劫持
    openmynet
        24
    openmynet  
       2020-04-21 10:22:09 +08:00
    HTMLScriptElement 可以换为 HTMLIFrameElement,HTMLImageElement 以拦截 iframe 与 image 方式的统计功能
    serenader
        25
    serenader  
       2020-04-21 10:38:00 +08:00 via iPhone   ❤️ 1
    CSP 就是用来帮你拦截不想要的请求的,不管是你自己还是你博客的访客。

    就算是纯静态博客也能配置 CSP,CSP 除了可以通过配置响应头来实现之外,也能使用 meta 标签来声明。

    楼上说的其他方法太 tricky 了,我不觉得是个好办法。
    dyxang
        26
    dyxang  
    OP
       2020-04-21 15:11:41 +08:00 via Android
    @ysc3839 #17
    这个是外部引用,自己改不了
    @Latin #22
    都说了是自己博客上面,不想让自己博客被别人统计……不是电脑屏蔽……
    @openmynet #23
    这段放在代码前还是代码后
    ysc3839
        27
    ysc3839  
       2020-04-21 19:30:00 +08:00 via Android
    @dyxang 改了重新传到自己网站不就好了?
    dyxang
        28
    dyxang  
    OP
       2020-04-21 20:05:57 +08:00 via Android
    @ysc3839
    最新的你用过吗?
    我以前试过,不能。
    ysc3839
        29
    ysc3839  
       2020-04-21 20:57:46 +08:00 via Android
    @dyxang 我没有相关环境,无法测试。
    你说的不能是怎么个不能?
    dyxang
        30
    dyxang  
    OP
       2020-04-21 22:22:50 +08:00 via Android
    @ysc3839 改了保存到自定义网址引用后无法使用
    ysc3839
        31
    ysc3839  
       2020-04-21 22:32:38 +08:00 via Android
    @dyxang 怎么个无法使用呢?遇到了什么错误吗?就不能一次性把问题说清楚吗?
    dyxang
        32
    dyxang  
    OP
       2020-04-22 00:27:49 +08:00 via Android
    @ysc3839 我现在也没有电脑,无法操作具现,很久之前试过的,貌似有验证,改了地址或者去掉了评论框的官网链接就无法使用。
    openmynet
        33
    openmynet  
       2020-04-23 10:17:35 +08:00
    @dyxang 放在前面
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.