我正在使用Firefox101.0.1和官方火狐插件页面中的扩展AdGuard。当激活这个扩展时,我会发现一些奇怪的广告软件,比如开发工具的JavaScript代码,并对每个页面呈现进行评估。
当我搜索这些日志的来源时,我会发现以下内容:
(function () {
try {
var AG_onLoad=function(func){if(document.readyState==="complete"||document.readyState==="interactive")func();else if(document.addEventListener)document.addEventListener("DOMContentLoaded",func);else if(document.attachEvent)document.attachEvent("DOMContentLoaded",func)};
var AG_removeElementById = function(id) { var element = document.getElementById(id); if (element && element.parentNode) { element.parentNode.removeChild(element); }};
var AG_removeElementBySelector = function(selector) { if (!document.querySelectorAll) { return; } var nodes = document.querySelectorAll(selector); if (nodes) { for (var i = 0; i < nodes.length; i++) { if (nodes[i] && nodes[i].parentNode) { nodes[i].parentNode.removeChild(nodes[i]); } } } };
var AG_each = function(selector, fn) { if (!document.querySelectorAll) return; var elements = document.querySelectorAll(selector); for (var i = 0; i < elements.length; i++) { fn(elements[i]); }; };
var AG_removeParent = function(el, fn) { while (el && el.parentNode) { if (fn(el)) { el.parentNode.removeChild(el); return; } el = el.parentNode; } };
var AG_removeCookie=function(a){var e=/./;/^\/.+\/$/.test(a)?e=new RegExp(a.slice(1,-1)):""!==a&&(e=new RegExp(a.replace(/[.*+?^${}()|[\]\\]/g,"\\A3")));a=function(){for(var a=document.cookie.split(";"),g=a.length;g--;){cookieStr=a[g];var d=cookieStr.indexOf("=");if(-1!==d&&(d=cookieStr.slice(0,d).trim(),e.test(d)))for(var h=document.location.hostname.split("."),f=0;f 0x7FFF) {
return;
}
} else if (value === '-1') {
constantValue = -1;
} else if (value === '') {
constantValue = '';
} else if (value === 'yes') {
constantValue = 'yes';
} else if (value === 'no') {
constantValue = 'no';
} else {
return;
}
var getCurrentScript = function getCurrentScript() {
if ('currentScript' in document) {
return document.currentScript;
}
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
};
var ourScript = getCurrentScript();
var canceled = false;
var mustCancel = function mustCancel(value) {
if (canceled) {
return canceled;
}
canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue;
return canceled;
};
var trapProp = function trapProp(base, prop, configurable, handler) {
if (!handler.init(base[prop])) {
return false;
}
var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);
var prevGetter;
var prevSetter;
if (origDescriptor instanceof Object) {
if (!origDescriptor.configurable) {
if (source.verbose) {
log("set-constant: property '".concat(prop, "' is not configurable"));
}
return false;
}
base[prop] = constantValue;
if (origDescriptor.get instanceof Function) {
prevGetter = origDescriptor.get;
}
if (origDescriptor.set instanceof Function) {
prevSetter = origDescriptor.set;
}
}
Object.defineProperty(base, prop, {
configurable: configurable,
get: function get() {
if (prevGetter !== undefined) {
prevGetter();
}
return handler.get();
},
set: function set(a) {
if (prevSetter !== undefined) {
prevSetter(a);
}
handler.set(a);
}
});
return true;
};
var setChainPropAccess = function setChainPropAccess(owner, property) {
var chainInfo = getPropertyInChain(owner, property);
var base = chainInfo.base;
var prop = chainInfo.prop,
chain = chainInfo.chain;
var undefPropHandler = {
factValue: undefined,
init: function init(a) {
this.factValue = a;
return true;
},
get: function get() {
return this.factValue;
},
set: function set(a) {
if (this.factValue === a) {
return;
}
this.factValue = a;
if (a instanceof Object) {
setChainPropAccess(a, chain);
}
}
};
var endPropHandler = {
factValue: undefined,
init: function init(a) {
if (mustCancel(a)) {
return false;
}
this.factValue = a;
return true;
},
get: function get() {
return document.currentScript === ourScript ? this.factValue : constantValue;
},
set: function set(a) {
if (!mustCancel(a)) {
return;
}
constantValue = a;
}
};
if (!chain) {
var isTrapped = trapProp(base, prop, false, endPropHandler);
if (isTrapped) {
hit(source);
}
return;
}
var propValue = owner[prop];
if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {
setChainPropAccess(propValue, chain);
}
trapProp(owner, prop, true, undefPropHandler);
};
setChainPropAccess(window, property);
}
function hit(source, message) {
if (source.verbose !== true) {
return;
}
try {
var log = console.log.bind(console);
var trace = console.trace.bind(console);
var prefix = source.ruleText || '';
if (source.domainName) {
var AG_SCRIPTLET_MARKER = '#%#//';
var UBO_SCRIPTLET_MARKER = '##+js';
var ruleStartIndex;
if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {
ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);
} else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {
ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);
}
var rulePart = source.ruleText.slice(ruleStartIndex);
prefix = "".concat(source.domainName).concat(rulePart);
}
var LOG_MARKER = 'log: ';
if (message) {
if (message.indexOf(LOG_MARKER) === -1) {
log("".concat(prefix, " message:\n").concat(message));
} else {
log(message.slice(LOG_MARKER.length));
}
}
log("".concat(prefix, " trace start"));
if (trace) {
trace();
}
log("".concat(prefix, " trace end"));
} catch (e) {
}
if (typeof window.__debug === 'function') {
window.__debug(source);
}
}
function noopArray() {
return [];
}
function noopObject() {
return {};
}
function noopFunc() {}
function trueFunc() {
return true;
}
function falseFunc() {
return false;
}
function noopPromiseReject() {
return Promise.reject();
}
function noopPromiseResolve() {
return Promise.resolve(new Response());
}
function getPropertyInChain(base, chain) {
var pos = chain.indexOf('.');
if (pos === -1) {
return {
base: base,
prop: chain
};
}
var prop = chain.slice(0, pos);
if (base === null) {
return {
base: base,
prop: prop,
chain: chain
};
}
var nextBase = base[prop];
chain = chain.slice(pos + 1);
if (nextBase !== undefined) {
return getPropertyInChain(nextBase, chain);
}
Object.defineProperty(base, prop, {
configurable: true
});
return {
base: nextBase,
prop: prop,
chain: chain
};
}
function setPropertyAccess(object, property, descriptor) {
var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);
if (currentDescriptor && !currentDescriptor.configurable) {
return false;
}
Object.defineProperty(object, property, descriptor);
return true;
}
function toRegExp() {
var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var DEFAULT_VALUE = '.?';
var FORWARD_SLASH = '/';
if (input === '') {
return new RegExp(DEFAULT_VALUE);
}
if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {
return new RegExp(input.slice(1, -1));
}
var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\A3');
return new RegExp(escaped);
}
function matchStackTrace(stackMatch, stackTrace) {
if (!stackMatch || stackMatch === '') {
return true;
}
var stackRegexp = toRegExp(stackMatch);
var refinedStackTrace = stackTrace.split('\n').slice(2)
.map(function (line) {
return line.trim();
})
.join('\n');
return stackRegexp.test(refinedStackTrace);
}
function nativeIsNaN(num) {
var native = Number.isNaN || window.isNaN;
return native(num);
};
const updatedArgs = args ? [].concat(source).concat(args) : [source];
try {
setConstant.apply(this, updatedArgs);
} catch (e) {
console.log(e);
}
})({"args":["PartnersCoupang","undefined"],"engine":"extension","name":"set-constant","ruleText":"~coupang.com,~coupangcdn.com#%#//scriptlet(\"set-constant\", \"PartnersCoupang\", \"undefined\")","verbose":true,"version":"4.0.181"}, ["PartnersCoupang","undefined"]);
} catch (ex) {
console.error('Error executing AG js: ' + ex);
}
})();
我很难在AdGuard扩展中找到这方面的来源,对我来说也很可疑,因为"coupang“是一家韩国的电子商务公司,我与他们没有任何关系。我还开始在阻塞列表订阅中搜索,但到目前为止还没有线索。我怎么能进一步调查这件事?
发布于 2022-06-14 16:38:36
快速浏览一下代码,我就会发现这个脚本是AdGuard的一部分,用来实现他们的脚本过滤列表规则。
AdGuard文档有我要说的是脚本:
Scriptlet是一个JavaScript函数,它为内容阻塞提供了扩展功能。这些函数可以在AdGuard过滤规则中以声明方式使用。语法:规则= "#%#//scriptlet(“scriptletName参数")”
您发布的脚本的末尾引用了以下规则,该规则似乎与AdGuard文档中的语法相匹配:
~coupang.com,~coupangcdn.com#%#//scriptlet("set-constant", "PartnersCoupang", "undefined")
在这种情况下,规则似乎使用set-constant
脚本来在正在查看的页面上下文中取消定义PartnersCoupang
常量,这可能是为了阻止在主页上的跟踪或广告脚本的功能。
https://security.stackexchange.com/questions/262725
复制相似问题