【发布时间】:2019-06-26 15:33:44
【问题描述】:
我正在编写一个用户脚本来防止网站设置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 ...
检测到恶意活动
不要试图欺骗我的广告拦截!
所以用户脚本加载成功,setter 也成功挂钩。但是在加载后我在控制台中尝试:
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,我想这是由于相同的原因。
【问题讨论】:
标签: javascript firefox tampermonkey adblock greasemonkey-4