Как определить, использует ли пользователь защиту от слежения в 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()