我正在编写一个用户脚本来防止网站设置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 上的行为很奇怪。
控制台中的输出是:
Loading ...
测试设置 document.body ...
检测到恶意活动
不要试图欺骗我的广告拦截!
所以用户脚本加载成功,设置器也成功挂钩。但是在加载后我在控制台中尝试:
document.body.innerHTML = ""
它只是设置innerHTML
不抛出错误,就好像尚未安装挂钩一样。我已经尝试了所有@run-at
选项,但它们都不起作用。
OTAH,如果我Object.defineProperty()
在控制台中使用,那么它可以按预期工作。因此我得出结论,Firefox 不尊重Object.defineProperty()
用户脚本。
您也可以尝试访问此网站:https ://connectwww.com 。在 Chrome 中的 Tampermonkey 中安装上述用户脚本后,网站上的 adblock-detection 被成功拦截。但是用户脚本在 Firefox+Greasemonkey 上不起作用。
为什么 Firefox不尊重Object.defineProperty()
用户脚本?有什么解决方法吗?
旁注:
一些著名的用户脚本如 anti-adblock-killer 也适用于上述测试网站的 Chrome 但不适用于 Firefox,我想这是由于相同的原因。