代码之家  ›  专栏  ›  技术社区  ›  Pharylon

为什么广告拦截器会阻止blob?

  •  6
  • Pharylon  · 技术社区  · 7 年前

    如果内容是blob,则广告阻止程序会阻止所有打开的新选项卡。我想这背后是有原因的,但我想不出来。我不认为blob有什么特别不安全的地方,或者浏览器本身会阻止它们,所以 为什么? 广告拦截器会在不给你选择的情况下完成吗?

    这是一个麻烦,因为使用堆栈溢出代码段不正确:

    https://jsfiddle.net/Pharylon/dqjtha81/32/

    const myString = "Hello World!";
    const blob = new Blob([myString], {
      type: 'text/plain'
    });
    const fileURL = URL.createObjectURL(blob);
    const myLink = document.getElementById("blob-link");
    myLink.setAttribute("href", fileURL);
    myLink.style.display = "block";
    
    document.getElementById("my-div").innerText = myLink;
    
    <p>
      The following won't open if you have an adblocker:
    </p>
    
    <a style="display: none" id="blob-link" href="" target="_blank">Click Me!</a>
    
    <p>
      But you can manually copy/paste this and it'll work:
    </p>
    
    <div id="my-div"></div>
    

    https://jsfiddle.net/pharlylon/dqjtha81/32/

    我的问题是 为什么 阻滞剂会这样做。谢谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Philipp Claßen    7 年前

    这是 easylist.txt 中的解释,一个流行的阻止列表:

    !用于多个网站以生成多个弹出窗口
    | dddata:文本$popup
    

    例如,当blobs与websockets结合使用时,要绕过所有adblocker,请参见/ublock/issues/1936 issuecomment-242901391“rel=”nofollow noreferrer“>ublock origin issues(仅重新格式化):。

    var b=“self.onmessage=函数(a){ “自我。开始= self.ws.onerror=函数(c){ 后消息(空) self.log(“websocket connected”)。 self.log(“websocket received msg.”); 后期消息(C.data) } }(二) self.requestads=函数(b){ 如果(self.ws.readystate!==1){ 设置超时(函数()。{ self.log(“等待连接”); 自我要求(B) },100) }其他{ 发送(B) } }(二) self.log=函数(b){ 如果(self.debug){ 控制台日志(B) } }(二) 如果(!自我.ws){ self.initws(self.wsurl); self.log(“初始化websocket”) }其他{ self.log(“websocket already connected”)。 } self.requestads(a.data) }(二) '; this.blob=新blob([b],类型:“application/javascript”); this.ww=new worker(url.createObjectURL(this.blob));返回
    列表:

    ! Used with many websites to generate multiple popups
    |blob:$popup
    |data:text$popup
    |dddata:text$popup
    

    这也在使用easylist(除其他外)的ublock-origin的输出中提到:

    enter image description here


    例如,当blobs与websockets结合使用时,bypass all adblockers at that time,请参见uBlock Origin issue(仅重新格式化):

    AdDelivery.prototype.createWW = function() {
        var b = "self.onmessage=function(a){
        self.debug = " + this.debug + ';self.wsurl="
        ' + this.websocketURL + '
        ";self.initWS=
    
        function(b) {
            self.ws = new WebSocket(b);
            self.ws.onerror = function(c) {
                self.log(
                    "Websocket error: " + c);
                postMessage(null)
            };
            self.ws.onopen = function(c) {
                self.log("Websocket connected")
            };
            self.ws.onmessage = function(c) {
                self.log("Websocket received msg.");
                postMessage(c.data)
            }
        };
        self.requestAds = function(b) {
            if (self.ws.readyState !== 1) {
                setTimeout(function() {
                    self.log("Waiting for connection");
                    self.requestAds(b)
                }, 100)
            } else {
                ws.send(b)
            }
        };
        self.log = function(b) {
            if (self.debug) {
                console.log(b)
            }
        };
        if (!self.ws) {
            self.initWS(self.wsurl);
            self.log("Initializing websocket")
        } else {
            self.log("Websocket already connected")
        }
        self.requestAds(a.data)
    };
    ';
    this.blob = new Blob([b], { type: "application/javascript" });
    this.ww = new Worker(URL.createObjectURL(this.blob)); return };