为了保存数据--其他脚本日志--我想重写console.log函数。我的脚本在任何其他脚本之前执行,所以我可以完全控制环境。这是我当前用于覆盖console.log的函数:
+function(){
var a = Function.prototype, b = 'toString', c = a[b], d = c.apply(c).split(c.name), e = [], f = [], g = function(a, b){
e.push(a);
f.push(b);
return a;
}, _ = [];
a[b] = function(h){
return g(function toString(){
var i = e.indexOf(this);
return i != -1 ? f[i] || d.join(this.name) : h.apply(this);
});
}(c);
console.log = function(a){
return g(function log(){
var b = [], i;
for(i in arguments) b.push(arguments[i]);
_.push(b.slice());
return a.apply(this, arguments);
});
}(console.log);
}();我的问题很简单:在此之后执行的某个脚本是否可能显示我有一个覆盖的console.log函数?
我将使用它来调试从用户发送到我的Node.js服务器应用程序的脚本。我使用的是vm模块,所以我需要覆盖沙箱对象的console.log函数,以便跟踪用户在接收到的脚本中记录到控制台的内容。
如果这段代码看起来很模糊,这里是一个更好的版本。
发布于 2016-08-11 23:33:37
我试图以各种方式对此进行黑客攻击,实际上,我能够检测到它的唯一方法是对console.log进行旧的引用并使用===。由于您在运行任何其他脚本之前都会运行您的代码,所以这不会是一个问题。
也就是说,还有console.info,warn,trace,所以也许你也想把它们包装起来?
从代码质量的角度来看,您的变量命名需要工作。您可以稍后通过一个小型机将其拖走;您现在拥有的是不可维护的。由于变量命名,我甚至不知道其中一半的功能。
发布于 2016-08-12 00:03:36
因为我的原始代码看起来非常模糊,这的文章说OP在接受答案后不允许编辑代码,所以我在这里写的是美化和易于理解的代码:
+function(){
var FunctionPrototype = Function.prototype;
var toStr = 'toString';
var originalFunc = FunctionPrototype[toStr];
var namePattern = originalFunc.apply(originalFunc).split(originalFunc.name);
var overwritenFuncs = [];
var overwritenFuncsNames = [];
var overwrite = function(originalFunction, overridenToStr){
overwritenFuncs.push(originalFunction);
overwritenFuncsNames.push(overridenToStr);
return originalFunction;
};
var tracedLogs = [];
FunctionPrototype[toStr] = function(h){
return overwrite(function toString(){
var i = overwritenFuncs.indexOf(this);
return i != -1 ? overwritenFuncsNames[i] || namePattern.join(this.name) : h.apply(this);
});
}(originalFunc);
console.log = function(originalConsoleLog){
return overwrite(function log(){
var b = [], i;
for(i in arguments) b.push(arguments[i]);
tracedLogs.push(b.slice());
return originalConsoleLog.apply(this, arguments);
});
}(console.log);
}();https://codereview.stackexchange.com/questions/138478
复制相似问题