我有一个这样的对象函数:
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()函数中,扫描“操作”的输入param函数代码,如果找到匹配项,则将代码注入特定位置。
我正在寻找的代码是:
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
上下文。您可以这样将其绑定到适当的this
上下文function.bind()
:
newAction = newAction.bind(params.bindTarget);
然后,当newAction执行时,任何params.bindTarget引用都将是this
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句