Я пишу пользовательский сценарий, чтобы веб-сайт не устанавливал document.body.innerHTML
, это типичный признак обнаружения веб-сайта рекламного блока:
(function() {
'use strict';
console.log("Loading ...");
Object.defineProperty(document.body, "innerHTML", {
set: function() {
console.log("malicious activity detected");
throw "Don't try to fool my adblock!";
}
});
console.log("Test setting document.body ...");
try {
document.body.innerHTML = "";
} catch (e) {
console.log(e);
}
}) ();
Приведенный выше пользовательский скрипт отлично работает для Chrome + Tampermonkey.Но его поведение в Firefox + Greasemonkey-4 странное.
Вывод в консоли:
Загрузка ...
Проверка настроек document.body ...
обнаружена вредоносная активность
Не пытайтесь обмануть мой рекламный блок!
Итак, пользовательский скрипт успешно загружается, и сеттер также успешно подключается.Но когда после загрузки я пытаюсь в консоли:
document.body.innerHTML = ""
, он просто устанавливает innerHTML
без ошибок, как если бы ловушка не была установлена.Я перепробовал все @run-at
опции, но ни один из них не работает.
OTAH, если я использую Object.defineProperty()
в консоли, то он работает как положено.Поэтому я прихожу к выводу, что Firefox не учитывает Object.defineProperty()
из пользовательского сценария.
Вы также можете попробовать посетить этот веб-сайт: https://connectwww.com. Если указанный выше пользовательский сценарий установлен в Tampermonkey в Chrome, обнаружение adblock насайт успешно перехвачен.Но пользовательский скрипт не работает в Firefox + Greasemonkey.
Почему Firefox не уважает Object.defineProperty()
из пользовательского скрипта?Есть ли обходной путь?
Примечание:
Некоторые известные пользовательские скрипты, такие как anti-adblock-killer, также работают на Chrome, но не Firefox для вышеуказанного сайта тестирования, я полагаюэто по той же причине.