首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用console.log覆盖本机console.log函数

用console.log覆盖本机console.log函数
EN

Code Review用户
提问于 2016-08-11 22:26:34
回答 2查看 2.1K关注 0票数 0

为了保存数据--其他脚本日志--我想重写console.log函数。我的脚本在任何其他脚本之前执行,所以我可以完全控制环境。这是我当前用于覆盖console.log的函数:

代码语言:javascript
复制
+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函数,以便跟踪用户在接收到的脚本中记录到控制台的内容。

如果这段代码看起来很模糊,这里是一个更好的版本。

EN

回答 2

Code Review用户

发布于 2016-08-11 23:33:37

我试图以各种方式对此进行黑客攻击,实际上,我能够检测到它的唯一方法是对console.log进行旧的引用并使用===。由于您在运行任何其他脚本之前都会运行您的代码,所以这不会是一个问题。

也就是说,还有console.infowarntrace,所以也许你也想把它们包装起来?

从代码质量的角度来看,您的变量命名需要工作。您可以稍后通过一个小型机将其拖走;您现在拥有的是不可维护的。由于变量命名,我甚至不知道其中一半的功能。

票数 2
EN

Code Review用户

发布于 2016-08-12 00:03:36

因为我的原始代码看起来非常模糊,的文章说OP在接受答案后不允许编辑代码,所以我在这里写的是美化和易于理解的代码:

代码语言:javascript
复制
+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);
}();
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/138478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档