Vm2: ๋ธŒ๋ผ์šฐ์ €์—์„œ vm2 ์‹คํ–‰ ์ง€์›

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

์ง€์  : https://github.com/patriksimek/vm2/tree/feature-browsers
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

์šฉ๋ฒ•

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

์ด์Šˆ

  • ์ƒŒ๋“œ ๋ฐ•์Šค๋Š” window.top ๋ฅผ ํ†ตํ•ด ์ด์Šค์ผ€์ดํ”„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ

  • ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์—์„œ NodeVM ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ๊ด€๋ จ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์— BrowserVM ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™” ๋œ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ.
feature request help wanted

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

์›น ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ vm2๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ํ•œ๋ฒˆํ•ด๋ณผ ๊ฒŒ์š”.

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

๋‹ค์†Œ ํ•ดํ‚ค ํ•œ ์†”๋ฃจ์…˜์€ ๊ฐ ์†์„ฑ ์•ก์„ธ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด AST ์žฌ ์ž‘์„ฑ์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด let x = foo.bar ๋Š” let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar) ๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ์— ๊ฐ์‹ธ AST ๋‹ค์‹œ ์“ฐ๊ธฐ์˜ ์˜ˆ๋Š” ์ด .

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ์žฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ Function, eval ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JS๋ฅผ ์ง์ ‘ ํ•ด์„ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌํ˜„ (์˜ˆ : ๋ณ€์ˆ˜ ์‚ฝ์ž… ๋ฐ ๊ตฌ๋ฌธ ๋ถ„์„)์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

document ๋ฐ top ๋ณ€์ˆ˜๋Š” ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ณ€์ˆ˜ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@ io4 , ๋Ÿฐํƒ€์ž„์—์„œ Function, eval ๋“ฑ์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ AST ์žฌ ์ž‘์„ฑ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— "์ปดํŒŒ์ผ ํƒ€์ž„"๊ณผ ๋Ÿฐํƒ€์ž„์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ•œ ๊ณ„์ธต์˜ ๊ฐ„์ ‘ ์ง€์ •์„ ๊ฑฐ์ณ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ซ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๊ด€๋ จ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์›น ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ vm2๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ํ•œ๋ฒˆํ•ด๋ณผ ๊ฒŒ์š”.

์ƒŒ๋“œ ๋ฐ•์Šค ์ฒ˜๋ฆฌ ๋œ iframe์—๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ด์Šค์ผ€์ดํ”„ํ•ด๋„ ์—ฌ์ „ํžˆ ํ”„๋ ˆ์ž„์œผ๋กœ ์ œํ•œ๋˜๋ฉฐ ์ตœ์ƒ์œ„ ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ƒํƒœ๋Š” ์›น ์ž‘์—…์ž๊ฐ€ ํ˜ธ์ŠคํŠธ์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒŒ๋“œ ๋ฐ•์Šค ์ฒ˜๋ฆฌ ๋œ iframe์„ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. allow-same-origin ์˜ต์…˜์ด ์—†์œผ๋ฉด vm2๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ตœ์ƒ์œ„ ์ฐฝ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํฌ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :)

์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋„์„œ๊ด€์ด ์—†์Šต๋‹ˆ๊นŒ? iframe๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

227์€ ํŠนํžˆ Realms๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ƒŒ๋“œ ๋ฐ•์‹ฑ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

realms-shim๊ณผ ๊ฐ™์€ ํŠธ๋ฆญ์œผ๋กœ ์ฐฝ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ตฌํ˜„์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
๋‹จ์ ์€ vm์˜ ๋ชจ๋“  ๊ฒƒ์ด ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@patriksimek ์ด window.top ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ • / ์‚ฌ์šฉ ๋œ ๊ฒฝ์šฐ ๊ฐœ์ฒด๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ (throw ๋ฐ ์˜ค๋ฅ˜)๋ฅผ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ์†์„ฑ์„ ๊ด€์ฐฐํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์ง€์  : https://github.com/patriksimek/vm2/tree/feature-browsers
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

์šฉ๋ฒ•

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

์ด์Šˆ

  • ์ƒŒ๋“œ ๋ฐ•์Šค๋Š” window.top ๋ฅผ ํ†ตํ•ด ์ด์Šค์ผ€์ดํ”„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ

  • ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์—์„œ NodeVM ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ๊ด€๋ จ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์— BrowserVM ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™” ๋œ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ.

๋‚˜๋Š” window ๋˜๋Š” window.top ๋ฅผ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๊ธฐ ์ „์— ๋˜์งˆ ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”
vm2.js ๋ฅผ typescript ํŒŒ์ผ์— ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ๋„์™€ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š”
vm2.js ๋ฅผ typescript ํŒŒ์ผ์— ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ๋„์™€ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋ชจ๋“ˆ๋กœ ์ž‘์—… : ํŒŒ์ผ ๋์— module.exports = vm2; ์ถ”๊ฐ€.

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