Vm2: ๋ฐฐ์—ด์„ ์‹คํ–‰ํ•˜๋ฉด ์ด์ƒํ•œ ๊ฐœ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. [Node.js 10.xx]

์— ๋งŒ๋“  2019๋…„ 04์›” 07์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: patriksimek/vm2

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ :

const { VM } = require('vm2')
const vm = new VM()
const res = vm.run('[1, 2, 3]')
console.log(res)

์ธ์‡„๋ฌผ:
[ 1, 2, 3, '0': 1, '1': 2, '2': 3 ]
์ด๊ฒƒ์€ ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๊นŒ?

VM์˜ NodeJS ๋นŒ๋“œ๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
[1, 2, 3]
์˜ˆ์ƒ๋Œ€๋กœ.

bug confirmed help wanted wontfix

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @patriksimek , ๋‚˜๋Š” ๋‹น์‹ ์„ ๋ฉ”์ธ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋กœ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ VM ๋ฐ NodeVM์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” NodeVM ๋‚ด๋ถ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค ๋‹ˆํŽซ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const array = [];
array.push({a: 1, b: 2});
console.log(array);

๊ทธ๋ฆฌ๊ณ  ์ธ์‡„ :

[{a: 1, b: 2}, '0': {a: 1, b: 2}]

NodeVM ์„ค์ •์˜ ์ฝ˜์†”์€ inherit ๋ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ ๊ท€์ฐฎ๊ฒŒํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  10 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @patriksimek , ๋‚˜๋Š” ๋‹น์‹ ์„ ๋ฉ”์ธ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋กœ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ VM ๋ฐ NodeVM์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” NodeVM ๋‚ด๋ถ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค ๋‹ˆํŽซ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const array = [];
array.push({a: 1, b: 2});
console.log(array);

๊ทธ๋ฆฌ๊ณ  ์ธ์‡„ :

[{a: 1, b: 2}, '0': {a: 1, b: 2}]

NodeVM ์„ค์ •์˜ ์ฝ˜์†”์€ inherit ๋ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ ๊ท€์ฐฎ๊ฒŒํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐœ์ฒด๋Š” ํ”„๋ก์‹œ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. Decontextify.instance ์–ด๋”˜๊ฐ€์— ์ž˜๋ชป๋œ ๊ฐœ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ v8.9.3 ๋ฐ ๋…ธ๋“œ v8.10.0์—์„œ ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ๋…ธ๋“œ v10.14.2์—์„œ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋‚ด ์ฝ”๋“œ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์•„์ฃผ ์ตœ์†Œํ•œ์˜ ์˜ˆ์ œ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  vm2 ๊ฐ€ ๋ฒ”์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. for of ๋ฃจํ”„๋„ ๋ฐฐ์—ด๋กœ ์ด์ƒํ•œ ์ผ์„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ v8.9.3 ๋ฐ ๋…ธ๋“œ v8.10.0์—์„œ ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ๋…ธ๋“œ v10.14.2์—์„œ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ v.8.10.0 ๋ฐ v10.14.2์—์„œ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์ด ๋‹ค๋ฅธ ์ฝ”๋“œ ์ค„์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” Proxy.handler.ownKeys () ํŠธ๋žฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ธ๋“œ์˜ ๋ฌธ์ œ์˜€์œผ๋ฉฐ v12์—์„œ ์ˆ˜์ • ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋Œ€์ฒด ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋Š” ๋…ธ๋“œ 10์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค๋ฒˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๋ฉด ์Šคํƒ ์ถ”์ ์„ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋…ธ๋“œ 10์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค๋ฒˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๋ฉด ์Šคํƒ ์ถ”์ ์„ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  ๊ตฌ์„ฑ ๋˜๋Š” CLI ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฒ€์‚ฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋งค์šฐ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

vm._context ์— console ์ถ”๊ฐ€
vm._context.console = console
vm.run("console.log([1,2,3])")
์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰