Se tudo o que você está fazendo é compilar código (pegar o código do usuário e transformá-lo sem executá-lo), não é diferente de proteger qualquer outro programa online. Você tem um programa (um compilador) que recebe uma entrada de usuário potencialmente não confiável (o código do usuário) e faz algo com ele, e você precisa ter certeza de que ele não fará nada que não deveria, mesmo quando receber uma entrada maliciosa. Para um compilador, muitos dos riscos de segurança da Web padrão (injeção de SQL, CSRF) realmente não se aplicam, mas você precisaria verificar riscos como estes:
- Para recursos de idioma como o #include do C, faça Certifique-se de não permitir a inclusão de arquivos fora dos arquivos de biblioteca padrão.
- Algumas linguagens podem ter CPU ou memória arbitrariamente grande para compilar (graças a recursos como os modelos Turing-complete do C ++, então você precisa se proteger contra a negação de serviço. No entanto, os sistemas operacionais e servidores da web há muito tempo têm recursos para encerrar processos que demoram muito ou crescem demais.
Se você estiver interpretando e executando o código do usuário, a segurança exigirá a execução do código do usuário em um sandbox de algum tipo. Por exemplo, se você desabilitar todas as chamadas de biblioteca que envolvem E / S de arquivo ou rede e chamadas de sistema operacional semelhantes, e se você tiver os limites acima mencionados em CPU e memória, então, em teoria, o código de usuário não pode fazer nada ruim. Na prática, isso pode ser muito complicado para acertar. Por exemplo, o Python permite que você execute código facilmente com globais restritos (para restringir o módulo os
), mas os recursos de linguagem e introspecção incorporados ainda fornecem funcionalidade suficiente para sair da área restrita. (Veja aqui .)
Outra abordagem para proteger um intérprete on-line ou REPL é executar tudo do lado do cliente (usando JavaScript e, possivelmente, ferramentas como Emscripten Se o código do usuário for executado na máquina do usuário, então o código do usuário mal-intencionado não é realmente o seu problema.
Atualização: Como aponta @JimmyHoffa, outra abordagem é usar o software OS ou VM para fornecer uma caixa de proteção mais completa do que a linguagem de programação foi projetada para fazê-lo. Para ver exemplos disso, consulte o sandbox do Chromium para Windows ou várias opções do Linux .