μλ
,
λ΄μ₯ λͺ¨λμ΄ νΈμ€νΈμμ νλ‘μλκ³ VMμμ νμνμ§ μμ μ΄μ λ₯Ό νμ
νλ €κ³ ν©λλ€.
μ΄κ²μ νμ¬ λ΄ μ€μ μ λλ€.
const vm = new NodeVM({
require: {
external: true,
context: 'sandbox',
builtin: ['*'],
},
});
vm.run(...);
VM λ΄λΆμλ μΈλΆ λͺ¨λ(μ€μν κ²½μ° axios
)μ΄ νμνκ³ μ’
μμ± μ²΄μΈμλ μ΄λ₯Ό μννλ λ€λ₯Έ λͺ¨λ( follow-redirects
)μ΄ νμν©λλ€.
var Writable = require('stream').Writable;
function RedirectableRequest(options, responseCallback) {
// .....
}
RedirectableRequest.prototype = Object.create(Writable.prototype);
RedirectableRequest.prototype._performRequest = function () { // <-------- this line breaks
// ..........
}
VM λ΄μμ μ΄ μ½λλ₯Ό μ€ννλ©΄ TypeError: 'set' on proxy: '_performRequest' μμ±μ λν΄ falseκ° λ°νλμμ΅λλ€.
μ€νΈλ¦Ό κ°μ²΄κ° VMμ νλ‘μλ©λλ€.
stream
κ° μ€μ λ‘ vm λ΄λΆμμ νμν λ μ΄ μ½λλ₯Ό μ€ννλ κ²μ
λλ€(μ¬κΈ°μμ if λ¬Έμ μ κ±°νμ¬: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133). μΌνκ³ μλ.
osxμμ λ Έλ 6.10.3μ μ€ν μ€μ λλ€.
κ°μ¬ ν΄μ
#127 κ΄λ ¨
λλ κ³μν΄μ if λ¬Έμ λ€μκ³Ό κ°μ΄ λ³κ²½νμ΅λλ€.
if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){
λ Έλ 8.xμμ async_hooks λ¬Έμ κ° λ°μνμ΅λλ€.
λλ λν λμ μ루μ μ μ°Ύμμ΅λλ€(ν¨λ¬λ€μμ λ μ ν©νλ€κ³ μκ°νλ μ루μ ).
κΈ°λ³Έμ μΌλ‘ λ΄κ° μ°Ύμ κ²μ 컨ν μ€νΈνλ μ½λκ° μ»¨ν μ€νΈμμ μμ±νμ§λ§ λ€λ₯Έ 컨ν μ€νΈμμ κ°μ Έμ¨ κ°μ²΄λ₯Ό νμ₯ν κ°μ²΄μ νλ‘ν νμ μ μ°λ €κ³ νλ€λ κ²μ΄μμ΅λλ€.
μΈνΈ νλ‘μ νΈλ€λ¬μ λν λ¬Έμμ λ°λΌ μ€μ νλ €λ κ°μ²΄μ μμ±μ΄ μμΌλ©΄ νλ‘ν νμ μΈνΈ νΈλ€λ¬κ° νΈμΆλ©λλ€.
κ·Έλμ;
물체
μκΈ°
<-μ΄ μ€μ (μ€μ λ‘ νλ‘ν νμ
μλ μ‘΄μ¬νμ§ μμ)
__proto__ (νλ‘μ)
set: (){} <- μ€μ λ‘ μ΄κ²μ νΈμΆν©λλ€.
κ·Έλ¦¬κ³ set νΈλ€λ¬κ° νΈμΆλλ©΄ μμ κΈ° μΈμλ μ°λ¦¬κ° μ€μ νλ €κ³ νλ μλ κ°μ²΄λ‘ μ€μ λ©λλ€. λ΄ μ루μ μ λ€μκ³Ό κ°μ΅λλ€.
--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
const OPNA = 'Operation not allowed on contextified object.';
const ERROR_CST = Error.captureStackTrace;
const FROZEN_TRAPS = {
- set: (target, key) => false,
+ set: (target, key, value, receiver) => {
+ if( target !== receiver ){
+
+ Object.defineProperty(receiver, key, {
+ value: value,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ })
+
+ return true;
+
+ }
+
+ return false;
+
+ },
μνκ° μ΄λ»μ΅λκΉ? νλ‘μ νΈ μ¬λ§?
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
κ°μ₯ μ μ©ν λκΈ
λλ λν λμ μ루μ μ μ°Ύμμ΅λλ€(ν¨λ¬λ€μμ λ μ ν©νλ€κ³ μκ°νλ μ루μ ).
κΈ°λ³Έμ μΌλ‘ λ΄κ° μ°Ύμ κ²μ 컨ν μ€νΈνλ μ½λκ° μ»¨ν μ€νΈμμ μμ±νμ§λ§ λ€λ₯Έ 컨ν μ€νΈμμ κ°μ Έμ¨ κ°μ²΄λ₯Ό νμ₯ν κ°μ²΄μ νλ‘ν νμ μ μ°λ €κ³ νλ€λ κ²μ΄μμ΅λλ€.
μΈνΈ νλ‘μ νΈλ€λ¬μ λν λ¬Έμμ λ°λΌ μ€μ νλ €λ κ°μ²΄μ μμ±μ΄ μμΌλ©΄ νλ‘ν νμ μΈνΈ νΈλ€λ¬κ° νΈμΆλ©λλ€.
κ·Έλμ;
물체
μκΈ°
<-μ΄ μ€μ (μ€μ λ‘ νλ‘ν νμ μλ μ‘΄μ¬νμ§ μμ)
__proto__ (νλ‘μ)
set: (){} <- μ€μ λ‘ μ΄κ²μ νΈμΆν©λλ€.
κ·Έλ¦¬κ³ set νΈλ€λ¬κ° νΈμΆλλ©΄ μμ κΈ° μΈμλ μ°λ¦¬κ° μ€μ νλ €κ³ νλ μλ κ°μ²΄λ‘ μ€μ λ©λλ€. λ΄ μ루μ μ λ€μκ³Ό κ°μ΅λλ€.