์ง์ : 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
์ ์ถ๊ฐํฉ๋๋ค.๋ค์ ํดํค ํ ์๋ฃจ์
์ ๊ฐ ์์ฑ ์ก์ธ์ค๋ฅผ ์๋์ผ๋ก ๋ํํ๊ธฐ ์ํด 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๊ฐ์ ๋ฉ์์ง๋ฅผ ๊ตํํ์ฌ ๊ฒ์ ํ ์์๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๊น?
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;
์ถ๊ฐ.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์น ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ vm2๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋๋ก ํ ์๊ฐ์ ๋๋ค. ํ๋ฒํด๋ณผ ๊ฒ์.