javascript:通过原型向方法添加行为 - 渗透代码
Posted
技术标签:
【中文标题】javascript:通过原型向方法添加行为 - 渗透代码【英文标题】:javascript:add behavior to method via prototype - infiltrate code 【发布时间】:2020-05-06 20:42:05 【问题描述】:我们有以下情况,我们使用库来加密东西,我想知道我们是否可以在加密之前更改参数。我可以轻松做到这一点:
MyEncoder.prototype.encode = (value) => //change it the way I want;
但是,在我改变它之前,我该怎么做才能让它像以前一样呢? (我知道!!!)
这行不通:var encoder = MyEncoder.prototype.encode;
,因为它只会复制方法,不会有 this
,而且,你知道的。
如果我可以调试encode
方法。这会有所帮助!
【问题讨论】:
试试这个MyEncoder.prototype.original_encode = MyEncoder.prototype.encode
不要在方法中使用箭头函数!使用真正的function
,其中this
可用,您可以在.call()
使用正确的this 参数的原始方法。
... 至于 OP 的根本问题是 method modify ...除了@987654329 之外,应该还有一天@,对 方法修饰符 的原生支持,例如 Function.prototype[before|after|around|afterThrowing|afterFinally]
,为此类任务提供防弹抽象级别。
【参考方案1】:
编写一个立即调用函数表达式 (IIFE),它一方面在它创建的闭包中保留原始原型encode
功能,另一方面返回您自己的encode
实现现在控制传递的参数和原始encode
的返回值。因此,有人编写了一种 around
方法修饰符 ...
MyEncoder.prototype.encode = (function /*create_around_modifier*/ (proto_encode)
return function /*modified_encode*/ (...argsArray)
// - intercept data flow ...
// ... e.g. look into or change the passed arguments.
// ... implement the **before** part.
// - call/invoke the original encode ...
//
// return value after invoking the original `encode`.
const result = proto_encode.apply(this, argsArray);
// - intercept data flow ...
// ... e.g. look at, work with or change the result.
// ... implement the **after** part.
//
// - do not forget the return value.
;
(MyEncoder.prototype.encode));
【讨论】:
【参考方案2】:真实的例子,比:
JSON.stringify = (function (proto_method)
return function (...args)
//I can to whatever I want before original method does it's job
return proto_method.apply(this, args);
;
(JSON.stringify));
鉴于 JSON 主要用于处理某种场景,因此我可以轻松更改参数,也许可以在加密之前检查已完成的操作。
谢谢大家。
【讨论】:
...好吧,差不多。由于stringify
是固定到JSON
命名空间的静态方法,因此其实现不依赖/中继任何绑定的this
上下文。至于你的例子,.apply(null, args)
也可以。
这就是我觉得奇怪的地方。我想我可能需要一些时间来研究 JS 中的命名空间,哈哈。谢谢以上是关于javascript:通过原型向方法添加行为 - 渗透代码的主要内容,如果未能解决你的问题,请参考以下文章