【问题标题】:How to remove or overwrite a function on a page using injected javascript?如何使用注入的 javascript 删除或覆盖页面上的函数?
【发布时间】:2013-08-06 09:29:33
【问题描述】:

我想使用通过 Google Chrome 扩展程序运行的注入 javascript 从页面中删除 javascript 函数。

出于问题的目的,让我们调用我要删除 testtest 的示例函数。在这种情况下,该函数在页面上如下所示:

var testtest() {
    somecode bla bla bla;
    somecode bla bla bla;
    somecode bla bla bla;
    return false;
}

基本上我想删除或阻止功能 testtest 在页面上运行。

我正在尝试使用 javascript 替换方法来执行此操作,但它不起作用。如果这不可能,我想要一个替代解决方案来实现我的最终目标(防止该功能在页面上运行)。

我收到 Hello World 弹出窗口,这意味着脚本正在页面上运行,但代码没有被替换。

这是我使用 javascript 替换方法的尝试:

尝试 1:

alert("Hello World!");
window.location = loc.replace(testtest, "aaaaa");

结论:
“Hello World”弹出窗口:成功
已替换代码:失败

--

尝试 2:

alert("Hello World!");
loc.replace(testtest, "aaaaa");

结论:
“Hello World”弹出窗口:成功
已替换代码:失败

--

尝试 3:

alert("Hello World!");
testtest= "aaaaa";

结论:
“Hello World”弹出窗口:成功
已替换代码:失败

--

尝试 4:

alert("Hello World!");
var str="testtest";
var n=str.replace("testtest","aaaaa");

结论:
“Hello World”弹出窗口:成功
已替换代码:失败


也许 javascript 替换方法不是实现我的最终目标的正确方法。我并不真正关心我是如何做到的,只要我实现了我的目标。请帮我找到解决方案。

更新:我尝试了其他三种方法,但都失败了。

尝试 5:

alert("Hello World!");
function pacifyGlobalFunction(testtest) {
Object.defineProperty(
    window,
    testtest,
    {
        value: function () {},
        configurable: true // permit future Object.defineProperty
    }
);
}

结论:
“Hello World”弹出窗口:成功
已替换代码:失败

--

尝试 6:

alert("Hello World!");
Object.defineProperty(window, 'testtest', {
    value: function(){/*This function cannot be overridden*/}
});

结论:
“Hello World”弹出窗口:成功
已替换代码:失败

--

尝试 7:

alert("Hello World!");
var actualCode = '(' + function() {
    window.testtest = null;
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

结论:
“Hello World”弹出窗口:成功
已替换代码:失败


所以我仍然需要一个解决方案。

【问题讨论】:

  • 当您说要修改函数时,为什么要尝试修改代码中的URL
  • Paul 你是对的,不需要loc = window.location.href;,不管尝试仍然没有删除脚本。

标签: javascript replace null overwrite inject


【解决方案1】:

您可以覆盖该函数。 例如,您的旧版本看起来像

function testMe() { 
   alert("Hi"); 
}

只需用这样的空内容覆盖它

function testMe() {}

因此,当在页面上调用 testMe(); 时,不会弹出任何警报 :)

【讨论】:

    【解决方案2】:

    您提到 Google Chrome 意味着您应该拥有Object.defineProperty;为window 创建一个不可写属性,以防止将其设置为其他内容

    function pacifyGlobalFunction(functionName) {
        Object.defineProperty(
            window,
            functionName,
            {
                value: function () {},
                configurable: true // permit future Object.defineProperty
            }
        );
    }
    

    【讨论】:

    • 我逐字尝试了这个,但它没有做任何事情,脚本仍然运行。同一文件中的 Hello World 弹出窗口运行良好,因此脚本在页面上运行,只是代码不起作用。
    • @user2651403 你能为我们在 jsfiddle 或 jsbin 上做一个实际的测试用例吗?
    • 不太可能演示。因为我们正在讨论使用 chrome 扩展更改或删除远程 url 上的功能。
    • 如果功能被删除,你的小提琴的预期输出是什么?我看到的唯一其他函数调用是alert.. 你想删除alert
    • 没有。我发出警报以确保它正在运行。您无法使用 jsfiddle 查看任何内容,因为我想删除远程域上的函数。演示的唯一方法是建立一个完整的站点只是为了制作一个功能,然后制作并安装扩展程序并访问该域并查看该功能是否被删除。
    【解决方案3】:
    function testtest() {}
    

    类似于:

    window.testtest = function () {};
    

    所以testtestwindow 对象的属性。

    您可以使用delete 从对象中删除属性。所以:

    delete window.testtest;
    

    应该删除该功能。该函数仍将被 调用 .. 所以你可能只想重新定义它。

    【讨论】:

    • 我需要该函数被调用,所以这不是一个可用的解决方案。
    猜你喜欢
    • 2010-10-10
    • 2019-08-30
    • 2022-11-09
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多