2015-02-07 26 views
12

Tôi chỉ làm việc trên văn bản một số câu đố ngẫu nhiên trên codewars.com và tò mò nếu có ai có thể nghĩ ra một cách để eval mã sau khi các mã sau đây đã được chạy:Khối eval && Chức năng mới

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 

Đây là trong node.js, vì vậy setTimeout("string") không hoạt động.

+1

Bạn có thể gửi bài thành công hơn này trên một trang web mã hóa thử thách. – Barmar

+0

Tôi cho rằng đây là biện pháp an ninh? trong trường hợp này, nó là một danh sách đen, như câu hỏi của bạn ngụ ý. – Timmerz

+1

@Barmar Tôi nghĩ đây là một trang web thách thức mã hóa? – Timmerz

Trả lời

9

Vâng, bạn cũng có biến số module trong node. Vì vậy, bạn có thể yêu cầu vm gói và chạy mã sử dụng phương pháp require của nó:

var vm = module.require('vm'); 
vm.runInThisContext(' console.log("hello") '); 

UPD Vâng, bạn cập nhật các câu hỏi, nhưng chúng ta có thể hack nó một lần nữa:

var vm = module.constructor.prototype.require('vm'); 
vm.runInThisContext(' console.log("hello") '); 

UPD2 Một biến thể khác:

var vm = module.constructor._load('vm'); 
vm.runInThisContext(' console.log("hello") '); 
.210

điều kiện UPD3 Một lần nữa được thay đổi để biến thể tiếp theo:

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") '); 

Tôi nghĩ tốt hơn để thiết lập module = undefined để làm cho câu hỏi phức tạp hơn :)

UPD4 Có biến thể khác mà không module:)

process.stdin.push(' console.log("here we are") \n '); 

Nhưng nó hoạt động chỉ trong CLI ("repl")

UPD5 Cũng trong iojs và trong node với phiên bản> = 0.11.x bạn có thể sử dụng contextify ràng buộc:

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

Trong node với phiên bản < 0.11.x bạn có thể sử dụng evals ràng buộc:

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

Upvoting, và sau đó sẽ chấp nhận vì đây là câu trả lời đúng đầu tiên :) Đang đợi câu trả lời nhiều hơn mặc dù: D –

+0

@zyklus Bạn đã thay đổi điều kiện của câu hỏi :) – alexpods

+0

Có, bởi vì tôi muốn càng nhiều câu trả lời càng tốt. Của bạn là chính xác, tôi không tranh chấp rằng :) –

5

module.require = undefined; là không đủ như require được thừa hưởng từ nguyên mẫu Module:

module.require = undefined; 

var vm = module.__proto__.require('vm'); 
vm.runInThisContext('console.log(1)'); 

Thay vào đó, bạn nên:

module.__proto__.require = undefined; 
// now this fails and you can't use the __proto__ trick: 
var vm = module.require('vm'); 
+0

tuyệt vời, cảm ơn bạn :) Tôi nên đã nhận ra rằng –

Các vấn đề liên quan