Как определить, использует ли пользователь защиту отслеживания в Firefox 42+

Firefox запустил функцию Защита от слежения в версии 42.0. Он блокирует несколько сценариев отслеживания, таких как Google Analytics, Marketo, LinkedIn и т.д.

Консольный выход

Я пытался обнаружить его через navigator.DoNotTrack, но он возвращает unspecified в обоих случаях - просмотр в обычном режиме и просмотр в частном режиме - с использованием Firefox 42.0 на Mac.

Как я могу определить в JavaScript, просматривается ли пользователь на веб-сайте с защитой отслеживания, поскольку navigator.DoNotTrack не удается?

Ответ 1

navigator.donottrack показывает только настройку "Не отслеживать" . Он не сообщает, включена ли защита отслеживания, которая является другой функцией. Защита от слежения включена автоматически в режиме частного просмотра, но пользователи могут изменить настройку примерно: 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

Вот немного улучшенная версия ответа 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;
}