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

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

Вывод на консоль предупреждений

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

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

2 ответа

Решение

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, для защиты от слежения; просто используйте домен, который вы знаете, находится в этом списке, и изображение, которое вы знаете, будет существовать.

Конечно, это может пометить любое количество причин, по которым изображение не загружается, в том числе проблемы с сетевым подключением, программное обеспечение для блокировки рекламы, фильтрация прокси и т. Д.

Вот слегка улучшенная версия ответа 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 seams this is a real 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 seams this is a real network error
                    resolve();
                }
            };
            img.src = '//apps.facebook.com/favicon.ico';
        });
    }

    return whenNoTrackingProtection.promise;
}

Вот обновленное решение без использования 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()
Другие вопросы по тегам