推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
dyxang

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

  •  
  •   dyxang · Apr 21, 2020 via Android · 5198 views
    This topic created in 2215 days ago, the information mentioned may be changed or developed.
    自己博客插入一段开源项目的 js,每次访问页面的时候都会请求 hm.baidu.com ,估计是开发者统计数据,但是我又不想让它访问。如何做到阻止?
    Supplement 1  ·  Apr 21, 2020
    算了……就让他统计吧……反正个人博客没什么值得统计的……
    Supplement 2  ·  Apr 21, 2020
    放上来吧:
    涉及到的项目

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

    换台电脑的试试看
    dyxang
        2
    dyxang  
    OP
       Apr 21, 2020 via Android
    @Jackwolf 我是安装了 ublock 才看到 hm.baidu.com block by cilent
    dyxang
        3
    dyxang  
    OP
       Apr 21, 2020 via Android
    @Jackwolf 控制台看到的,但我又不想让自己网页挂上了别人的统计…
    dyxang
        4
    dyxang  
    OP
       Apr 21, 2020 via Android
    @Jackwolf 啊发快了,控制台看到发起程序链就是由这个开源项目的 js 发起的
    Elissa
        5
    Elissa  
       Apr 21, 2020
    检查博客的插件、主题、模板是否含有统计链接
    dyxang
        6
    dyxang  
    OP
       Apr 21, 2020 via Android
    @Elissa 静态的,貌似是这个项目的开发者在 js 藏了一段请求
    foru17
        7
    foru17  
       Apr 21, 2020
    adguard home 或者 pihole
    serenader
        8
    serenader  
       Apr 21, 2020   ❤️ 2
    配置 CSP 头,浏览器就能帮你拦截掉。
    iNaru
        9
    iNaru  
       Apr 21, 2020   ❤️ 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
       Apr 21, 2020 via Android
    @foru17
    我的意思是不要访问页面的人被统计代码给统计到,而不是不要我访问页面被统计到,页面(博客)是我的😂
    @serenader
    ysc3839
        11
    ysc3839  
       Apr 21, 2020
    既然是开源项目,自己去掉这段统计就好了吧?
    另外说说是什么项目?
    eason1874
        12
    eason1874  
       Apr 21, 2020   ❤️ 1
    我想到的几个方法。

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

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

    三是提前把百度统计使用的设置变量 _hmt 设置成你自己的参数,并且通过 Object.freeze 锁定,不让修改,这样统计就统计到你自己的账号了。我感觉可行,不过我没试过。
    dyxang
        13
    dyxang  
    OP
       Apr 21, 2020 via Android
    @ysc3839 就是去不掉才没辙问 V2EX 啊
    valine,评论系统,目前最新 1.4.4
    autoxbc
        14
    autoxbc  
       Apr 21, 2020   ❤️ 2
    CSP 可以做到,或者给全局对象 XMLHttpRequest 和 fetch 套一层判断函数
    dyxang
        15
    dyxang  
    OP
       Apr 21, 2020 via Android
    @autoxbc 静态博客……
    dyxang
        16
    dyxang  
    OP
       Apr 21, 2020 via Android
    @autoxbc 啊不好意思,犯了望文生义的错了,以为是动态博客和服务器才能做的
    ysc3839
        17
    ysc3839  
       Apr 21, 2020
    @dyxang 搜索 hm.baidu.com 能找到相关代码,删除即可。
    ysc3839
        18
    ysc3839  
       Apr 21, 2020
    zhw2590582
        19
    zhw2590582  
       Apr 21, 2020   ❤️ 1
    统计原理是发起有个 img 的 http 请求,语法是 var img = new Image; img.src='baidu.com';
    那样的话,我可以在这个脚本加载前,重定义构造函数 Image,当实例的 src 等于 baidu.com 就直接返回就可以了。
    kingcc
        20
    kingcc  
       Apr 21, 2020 via Android
    service worker
    foxt8
        21
    foxt8  
       Apr 21, 2020
    同用 Vline,没有遇到这个问题?
    Latin
        22
    Latin  
       Apr 21, 2020
    hosts
    0.0.0.0 hm.baidu.com
    openmynet
        23
    openmynet  
       Apr 21, 2020   ❤️ 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  
       Apr 21, 2020
    HTMLScriptElement 可以换为 HTMLIFrameElement,HTMLImageElement 以拦截 iframe 与 image 方式的统计功能
    serenader
        25
    serenader  
       Apr 21, 2020 via iPhone   ❤️ 1
    CSP 就是用来帮你拦截不想要的请求的,不管是你自己还是你博客的访客。

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

    楼上说的其他方法太 tricky 了,我不觉得是个好办法。
    dyxang
        26
    dyxang  
    OP
       Apr 21, 2020 via Android
    @ysc3839 #17
    这个是外部引用,自己改不了
    @Latin #22
    都说了是自己博客上面,不想让自己博客被别人统计……不是电脑屏蔽……
    @openmynet #23
    这段放在代码前还是代码后
    ysc3839
        27
    ysc3839  
       Apr 21, 2020 via Android
    @dyxang 改了重新传到自己网站不就好了?
    dyxang
        28
    dyxang  
    OP
       Apr 21, 2020 via Android
    @ysc3839
    最新的你用过吗?
    我以前试过,不能。
    ysc3839
        29
    ysc3839  
       Apr 21, 2020 via Android
    @dyxang 我没有相关环境,无法测试。
    你说的不能是怎么个不能?
    dyxang
        30
    dyxang  
    OP
       Apr 21, 2020 via Android
    @ysc3839 改了保存到自定义网址引用后无法使用
    ysc3839
        31
    ysc3839  
       Apr 21, 2020 via Android
    @dyxang 怎么个无法使用呢?遇到了什么错误吗?就不能一次性把问题说清楚吗?
    dyxang
        32
    dyxang  
    OP
       Apr 22, 2020 via Android
    @ysc3839 我现在也没有电脑,无法操作具现,很久之前试过的,貌似有验证,改了地址或者去掉了评论框的官网链接就无法使用。
    openmynet
        33
    openmynet  
       Apr 23, 2020
    @dyxang 放在前面
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5350 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 09:23 · PVG 17:23 · LAX 02:23 · JFK 05:23
    ♥ Do have faith in what you're doing.