簡體   English   中英

將javascript注入對象函數

[英]Inject javascript into object function

我有一個這樣的對象函數:

var batman = function () {
    this.constructor.prototype.go = function(params){
        ......
    }
}

在調用 batman.go() 時,我傳遞了一個帶有幾個鍵的對象,例如:

{
    a:1,
    b:2,
    action:function(){..code to scan and inject into...}
}

我的問題是,我如何在 batman.go() 函數中,掃描“action”的輸入參數函數代碼,如果找到匹配項,則將代碼注入某個位置。

我正在尋找的代碼是:

history.pushState({name:'homepage'},null,uri);

我想注入,所以它看起來像這樣:

history.pushState({id:an_id_variable,name:'homepage'},null,uri);

插入的是:

id:an_id_variable

使用function.toString()獲取params.action的源,使用String.replace()查找和替換有問題的代碼段的出現,然后使用Function()構造函數使用修改后的源代碼動態創建新函數:

var batman = function () {
    this.constructor.prototype.go = function(params){
        ...
        let newAction = new Function(params.action.toString().replace(
            /history\.pushState\({name:'homepage'},null,uri\);/g,
            `history.pushState({id:${an_id_variable},name:'homepage'},null,uri);`
        ));
        //use newAction() however you like
    }
}

應該注意的是,如果任何最終用戶對params.action的內容有任何控制權,這將允許該用戶完全任意代碼注入 - 但正如評論中指出的那樣,任意代碼已經可以運行在瀏覽器上通過開發者控制台。 請注意此類解決方案的安全隱患。

另請注意,使用 Function 構造函數會將函數綁定到全局范圍,並且會丟失任何this上下文。 您可以使用function.bind()將其綁定到適當的this上下文,如下所示:

newAction = newAction.bind(params.bindTarget);

然后,當 newAction 執行時,任何 params.bindTarget 引用都將是this

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM