Node VM and ChildProcess
Executando códigos não confiáveis no seu servidor
Evandro EisingerEngenheiro de Software - globo.com
Jonathan PratesEngenheiro de Software - globo.com
Motivação :)
LIGUE QUATRO
1. Como rodar código de uma forma segura?
2. Como otimizar o processamento das partidas?
Problemas :(
function Player () {
var fs = require('fs');
this.move = function () {
// hora de dar tchau
while (true) {
console.log(process.pid);
console.log(__filename);
console.log(fs.readdirSync(__dirname));
}
return 0;
}
}
Code time #
Modulo para gerenciar contextos (execution
environment) da engine (v8).
Node VM
Node VM server para compilar e executar código
em contextos isolados.
require('vm')
Compila, executa e retorna o resultado. Não tem
acesso ao escopo local, mas tem aos objetos
globais.
vm.runInThisContext(code, options)
Code time #
Gera um novo ambiente de execução na engine
(v8) a partir de um objeto.
vm.createContext(context)
Code time #
Compila, executa o código no contexto passado e
retorna o resultado.
vm.runInContext(code, context,
options)
Code time #
Compila, não executa e nem vincula a um
contexto.
vm.Script(code, options)
Code time #
Solução o/
Code time #
"Note that running untrusted code is a tricky
business requiring great care."
"script.runInNewContext is quite useful, but
safely running untrusted code requires a separate
process."
Carrega e executa um processo filho (no sistema
operacional) e captura as saídas do programa.
Child Process
"It is possible to stream data through a child's
stdin, stdout, and stderr in a fully non-blocking
way."
"Child processes and parent processes can
communicate neatly back and forth, and parent
processes can listen to and control their child
processes."
spawn, parent and pid #
stdin, stdout and stderr #
Executa um comando e armazena o retorno em
um buffer.
child_process.exec(cmd, opts, cb)
Code time #
Executa um comando e envia ao processo pai o
retorno através de streams.
child_process.spawn(cmd, args, opts)
Code time #
Executa um processo filho do nodejs. Permite a
comunicação entre pai e filho através da classe
EventEmitter.
child_process.fork(module, args, opts)
"These child Node.js processes are still whole new
instances of V8. Assume at least 30ms startup and
10mb memory for each new Node.js. That is, you
cannot create many thousands of them."
"Unlike the fork() POSIX system call,
child_process.fork() does not clone the current
process."
Code time #
Solução o/
runnner.js
Processo (pai)
Contexto
(v8)
X
match.js
Processo (filho)
P1 Contexto
(v8)
P2 Contexto
(v8)
Contexto (v8)
cpu's
Cria partida
Retorna resultado
LIGUE QUATRO
lig4.globo.com
talentos.globo.com
Obrigado !
Dúvidas ?

Node VM and ChildProcess: Executando códigos não confiáveis no seu servidor