Por melhores que sejam os processos filhos, eles devem ser usados com cautela. A transmissão da entrada do usuário deve ser higienizada, se não completamente evitada. Os perigos de entradas não analisadas executando em nível de lógica de sistema são ilimitados, alcançando desde a execução remota de código até a exposição de dados confidenciais do sistema e até mesmo perda de dados. Uma lista de verificação de preparações pode ser algo do tipo:
- evite a entrada do usuário em todos os casos, senão, valide e limpe-a
- limitar os privilégios dos processos pai e filhos usando identidades de usuário/grupo
- execute o seu processo dentro de um ambiente isolado para evitar efeitos colaterais indesejados se as outras preparações falharem
const { exec } = require('child_process');
...
// por exemplo, pegue um script que receba dois argumentos, um deles é uma entrada do usuário não-analizada
exec('"/path/to/test file/someScript.sh" --someOption ' + input);
// -> imagine o que poderia acontecer se o usuário simplesmente inserisse algo como '&& rm -rf --no-preserve-root /'
// você teria uma surpresa indesejada
Da documentation do Node.js sobre processos filhos:
Nunca passe a entrada de usuário não-analizada para esta função. Qualquer entrada contendo metacaracteres de shell pode ser usada para disparar a execução arbitrária de comandos.