如何检测用户是否在Firefox 42+中使用跟踪保护

20

Firefox在v42.0中推出了名为跟踪保护的功能。它可以阻止Google Analytics、Marketo、LinkedIn等多个跟踪脚本。

"Tracking protection"警告控制台输出

我试图通过navigator.DoNotTrack来检测,但无论是在常规模式下还是在Mac上使用Firefox 42.0的隐私模式下,它都返回unspecified

如何在JavaScript中检测用户是否打开了跟踪保护,既然navigator.DoNotTrack失败了?


1
“如何检测用户是否使用了追踪保护?似乎有点适得其反,你不觉得吗?” - TylerH
6
如果你想告诉用户“你错过了应用程序的重要功能-使用常规浏览模式,这样和那样的功能将对你可用”,那么就不应该这样做。 - Petr Hejda
1
是的,避免此类跟踪消息正是跟踪保护/隐私浏览的重点。您不希望被跟踪,即使是间接地。也就是说,我不希望你知道我在哪里,甚至不希望你知道我在你的区域内。只需为所有用户在页面顶部放置一个“此网站使用cookie”类型的横幅即可。 - TylerH
3个回答

20

navigator.donottrack 只显示 "不追踪" 偏好设置。它并不能告诉您是否启用了不同的功能跟踪保护。当处于私密浏览模式时,跟踪保护会自动启用,但用户可以更改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使用Disconnect获取的列表来进行其跟踪保护;只需使用您知道在该列表中的域名和您知道存在的图像即可。

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


2
这个目前不起作用。更可靠的是在主流浏览器上实现的 navigator.doNotTrack - Marcos Pérez Gude
5
你有没有读我的回答里的第一句话,MarcosPérezGude?它们是两个完全不同的事情。 - miken32
@miken32,很遗憾//apps.facebook.com/favicon.ico无法访问,您是否有任何固定的资源CDN链接? - Pradeep kumar

8
这是稍微改进过的miken32答案的版本,使用了Deferred:

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;
}

2
我喜欢这段代码,但不幸的是,在我的使用情况下,“//apps.facebook.com/favicon.ico”在隐私模式下不再被阻止。我改用类似的资产,该资产托管在被隐私模式阻止的服务上。 - Graham P Heath

4

这里是一种没有使用jQuery,而是使用Promise的更新解决方案。感谢@miken32和@sleepwalker。

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

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接