【问题标题】:How to detect if a user is using tracking protection in Firefox 42+如何检测用户是否在 Firefox 42+ 中使用跟踪保护
【发布时间】:2016-03-01 18:29:20
【问题描述】:

Firefox 在 v42.0 中推出了一个名为 Tracking protection 的功能。它会阻止多个跟踪脚本,例如 Google Analytics、Marketo、LinkedIn 等。

我试图通过navigator.DoNotTrack 检测它,但在两种情况下它都会返回unspecified——在常规模式下浏览,在私密模式下浏览——在 Mac 上使用 Firefox 42.0。

由于navigator.DoNotTrack 失败,我如何在 JavaScript 中检测用户是否正在查看启用了跟踪保护的网站?

【问题讨论】:

  • "如何检测用户是否使用了跟踪保护?"似乎有点错过了跟踪保护的意义,你不觉得吗?
  • @TylerH:如果您想告诉用户“您缺少应用程序的重要功能 - 使用常规浏览模式,您可以使用这个和那个”,请不要这样做。跨度>
  • 是的,避免此类跟踪消息是跟踪保护/隐私浏览的要点。你不想被跟踪,即使是间接的。 AKA 我不想让你知道我在哪里,甚至我在你所在的地区。只需为所有用户在页面顶部放置一个“此网站使用 cookie”类型的横幅即可。

标签: javascript firefox privacy navigator do-not-track


【解决方案1】:

navigator.donottrack 仅显示"Do not track" 首选项的设置。它不知道是否启用了不同功能的tracking protection。在隐私浏览模式下会自动启用跟踪保护,但用户 can change a setting in about:config 会一直启用它。

虽然您无法直接判断该功能是否已启用,但您可以通过以下方式检查其效果:

var canreach = false;
$(function() {
    $('<img/>')
        .attr("src", "//apps.facebook.com/favicon.ico")
        .load(function(){canreach = true;})
        .css("display", "none")
        .appendTo(document.body);
});

Firefox usesDisconnect获取的列表,用于跟踪保护;只需使用您知道在该列表中的域,并且您知道将存在的图像。

当然,这可能会标记出图片无法加载的任何原因,包括网络连接问题、广告拦截软件、过滤代理等。

【讨论】:

  • 目前这不起作用。在主流浏览器上实现的navigator.doNotTrack 更可靠。
  • 你读过我的回答@MarcosPérezGude的第一句话吗?它们是两个完全不同的东西。
  • @miken32,不幸的是 //apps.facebook.com/favicon.ico 无法访问,您有任何固定资源 CDN 链接吗?
【解决方案2】:

这是 miken32 使用 Deferred 的答案的略微改进版本:

function whenNoTrackingProtection() {
    if (!whenNoTrackingProtection.promise) {
        var dfd = new $.Deferred();
        whenNoTrackingProtection.promise = dfd.promise();

        var time = Date.now();
        $('<img/>')
            .attr('src', '//apps.facebook.com/favicon.ico')
            .on('load', dfd.resolve)
            .on('error', function() {
                if ((Date.now() - time) < 50) {
                    dfd.reject();
                } else {
                    // The request took to long, it seems this is a network error.
                    dfd.resolve();
                }
            });
    }

    return whenNoTrackingProtection.promise;
}

或者不使用 jQuery,使用 Promise:

function whenNoTrackingProtection() {
    if (!whenNoTrackingProtection.promise) {
        whenNoTrackingProtection.promise = new Promise(function(resolve, reject) {
            var time = Date.now();
            var img = new Image();
            img.onload = resolve;
            img.onerror = function() {
                if ((Date.now() - time) < 50) {
                    reject();
                } else {
                    // The request took to long, it seems this is a network error.
                    resolve();
                }
            };
            img.src = '//apps.facebook.com/favicon.ico';
        });
    }

    return whenNoTrackingProtection.promise;
}

【讨论】:

  • 我喜欢这个代码,但不幸的是我的使用 //apps.facebook.com/favicon.ico 不再打破隐私模式。相反,我使用托管在被隐私模式阻止的服务上的类似资产。
【解决方案3】:

这是一个更新的解决方案,不使用 jQuery,使用 Promise。感谢@miken32 和@sleepwalker。

为什么我更喜欢这个解决方案而不是基于 navigator.doNotTrack 的解决方案?在 Firefox 中,navigator.doNotTrack 在严格的增强跟踪保护下返回 1,但在 Google Chrome 中,用户需要启用使用浏览流量发送“不跟踪”请求。

function whenNoTrackingProtection() {
    if (!whenNoTrackingProtection.promise) {
        whenNoTrackingProtection.promise = new Promise(function(resolve, reject) {
            var time = Date.now();
            var img = new Image();
            img.onload = resolve;
            img.onerror = function() {
                if ((Date.now() - time) < 50) {
                    reject(new Error("Rejected."));
                } else {
                    resolve(new Error("Takes too long."));
                }
            };
            img.src = '//www.facebook.com/tr/';
        }).then((result) => {
          console.log("Tracking OK");
        }).catch(e => {
          console.log("Tracking KAO");
          console.log(e)
        });
    }
}
whenNoTrackingProtection()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2019-07-21
    • 2011-08-17
    • 2020-10-30
    • 2011-01-12
    • 2012-02-24
    • 2012-04-28
    相关资源
    最近更新 更多