阻止评估和新功能
Block eval && new Function
我只是在 codewars.com 上编写一些随机谜题,我很好奇是否有人能在运行以下代码后想到一种评估代码的方法:
eval = function(){};
delete Function.prototype.constructor;
Function = undefined;
// the following are to block require('vm') -- if anyone wants to run this
// in production it may be better to block that one module (others?)
require = undefined;
module.__proto__.require = undefined; // added this due to alexpod's answer, modified due to Fabrício Matté's :)
module.constructor = undefined; // added this due to alexpod's answer
这是在节点.js中,所以setTimeout( "string" )
不起作用。
好吧,你在node
中也有module
变量。因此,您可以使用其require
方法要求vm
包并运行代码:
var vm = module.require('vm');
vm.runInThisContext(' console.log("hello") ');
UPD好吧,您更新了问题,但我们可以再次破解它:
var vm = module.constructor.prototype.require('vm');
vm.runInThisContext(' console.log("hello") ');
UPD2另一个变体:
var vm = module.constructor._load('vm');
vm.runInThisContext(' console.log("hello") ');
UPD3再次更改条件,以便下一个变体:
module.constructor.prototype._compile(' console.log("again hacked") ');
// or
module.__proto__._compile(' console.log("again hacked") ');
// or
Object.getPrototypeOf(module)._compile(' console.log("again hacked") ');
我认为最好设置module = undefined
以使问题更复杂:(
UPD4还有另一种没有module
:)的变体
process.stdin.push(' console.log("here we are") 'n ');
但它仅适用于 CLI("repl"(
UPD5同样在版本>= 0.11.x 的 iojs
和node
中,您可以使用contextify
绑定:
var contextify = process.binding('contextify');
var script = new contextify.ContextifyScript(' console.log("im here, buddy") ');
script.runInThisContext();
在版本 <0.11.x 的node
中,您可以使用evals
绑定:
var evals = process.binding('evals');
var script = new evals.NodeScript(' console.log("here I am") ')
script.runInThisContext();
module.require = undefined;
是不够的,因为require
是从模块原型继承而来的:
module.require = undefined;
var vm = module.__proto__.require('vm');
vm.runInThisContext('console.log(1)');
相反,您应该:
module.__proto__.require = undefined;
// now this fails and you can't use the __proto__ trick:
var vm = module.require('vm');
使用 GeneratorFunction 构造函数:
(function*(){}).constructor('console.log(1);')().next().value;
相关文章:
- 按下一个HTML按钮,该按钮使用一个功能在同一个新窗口中打开URL
- 为什么这个功能打印“;未定义的未定义的“;作为联系人名称,添加“新对象”
- 美国地图插件,具有状态数据/悬停功能的新按钮
- 功能点击使打开新链接,不转到原始链接
- 是否有用于CSS浏览器支持新功能的javascript解决方案
- 点击功能打开新窗口并计算点击次数
- jQuery点击功能只工作一次(新情况)
- 需要类似于谷歌联系人的功能-“;新联系人”;
- 类型错误:'未定义'不是Sencha Touch和cordova 3.0的功能(评估'cordo
- 阻止评估和新功能
- 如何在 Crockford 的新构造函数模式中共享“构造函数”功能
- 另一个新功能中的新功能
- Jquery 的新功能 - 它根本不在任何浏览器上加载或工作
- 和服:修改数据、分解字符串和添加新属性的功能
- 覆盖嵌套函数或附加新功能
- 为话语添加新功能
- 谷歌应用程序脚本的新功能'的HTML服务
- 这是ES6的新功能吗
- 使用新功能是否被视为安全风险
- 什么'这是iOS 5 Safari中web开发人员的新功能