gpt4 book ai didi

javascript - block eval && new 函数

转载 作者:IT老高 更新时间:2023-10-28 23:10:43 25 4
gpt4 key购买 nike

我只是在 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

这是在 node.js 中,所以 setTimeout( "string") 不起作用。

最佳答案

好吧,您在 node 中也有 module 变量。所以你可以 require vm 包并使用它的 require 方法运行代码:

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同样在 iojs 和版本 >= 0.11.x 的 node 中,您可以使用 contextify 绑定(bind):

var contextify = process.binding('contextify');
var script = new contextify.ContextifyScript(' console.log("im here, buddy") ');
script.runInThisContext();

node 版本 < 0.11.x 中,您可以使用 evals 绑定(bind):

var evals = process.binding('evals');
var script = new evals.NodeScript(' console.log("here I am") ')
script.runInThisContext();

关于javascript - block eval && new 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28377412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com