2015-02-07 3 views
12

Я просто работаю над написанием некоторых случайных головоломок на codewars.com и любопытно, если кто-то могут придумать способ, чтобы Eval кода после того, как следующий код был запущен:блока Eval && новая функция

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") не работает.

+1

Вы могли бы быть более успешным, размещение этого на кодирование вызов сайта. – Barmar

+0

Я предполагаю, что это касается мер безопасности? в этом случае это черный список, как предполагает ваш вопрос. – Timmerz

+1

@Barmar Я думал, что это был сайт для кодирования? – Timmerz

ответ

9

Ну, также у вас есть module переменная в node. Таким образом, вы можете потребовать 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 и в node с версии> = 0.11.x вы можете использовать contextify связывания:

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

В node с версии < 0.11.x вы можете использовать evals связывания:

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

Upvoting, и позже согласимся, так как это первый правильный ответ :) В ожидании большего количества ответов: D –

+0

@zyklus Вы изменили условие вопроса :) – alexpods

+0

Да, потому что я хочу как можно больше ответов. С уважением, я не оспариваю это :) –

5

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'); 
+0

awesome, спасибо :) Я должен был понять, что –

Смежные вопросы