如何防止执行某一行Javascript代码?



假设您正在访问一个使用JavaScript (jquery)的网站。当然,脚本中有一些函数定义。像这样:

$(function () {
// Some necessary code here...
someObject.doSomethingUndesirable();
// Some necessary code here...
});

我的问题是我不希望那行代码被执行。当然,我可以在页面加载后注释掉这一行,但由于脚本已经在内存中,因此修改将不起作用。

所以我的问题很简单:我能以某种方式干扰加载过程并防止加载(因此执行)一行JavaScript代码吗?

如果您可以在站点代码运行之前注入代码-例如使用userscript和@run-at document-start指令-您可以覆盖$以忽略回调:

// Userscript code
$ = (callback) => {};
// Site code
$(function() {
someObject.doSomethingUndesirable();
});

如果$还没有定义,你也可以在window.$上定义一个setter,这样它的初始赋值就会被忽略或覆盖:

// Userscript code
Object.defineProperty(window, '$', {
get() {
return (callback) => {};
}
});
// Site code
$(function() {
someObject.doSomethingUndesirable();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

更狡猾但更灵活的方法是检测站点的<script>节点的附加并修补它,或者使用Chrome本地覆盖或Fiddler等网络工具提前修补它。

我猜你可以使用userscript来修改对象的类,如果它是静态的。一种方法是通过代理对象监听'someObject'变量的变化。然后,当他定义doSomethingUndesirable函数时,您可以将其替换为一个不返回任何值,null或任何您想要的函数。

//Init variable
var someObject = {};
var someObjectProxy = new Proxy(someObject, {
set: function (target, key, value) {
if(key = "doSomethingUndesirable"){
//Redefinition of the function
target[key] = ()=>{return null};}
return true;
}
});
/*....*/
//Example of definition
someObject.somethingUndesirable = ()=>{return 10+10}
//The proxy will trigger and redefine the function to return null

最新更新