[英]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.