Pergunta

Parte da nossa aplicação java precisa ser executado javascript que é escrito por não-desenvolvedores. Estes não-desenvolvedores estão usando javascript para formatação de dados. (Lógica simples e concatenação principalmente).

A minha pergunta é como eu posso configurar a execução desses scripts para garantir que os erros de script não tem um impacto negativo importante sobre o resto da aplicação.

  • necessidade de se proteger contra loops infinitos
  • Proteja-se contra a desova novos tópicos.
  • Limitar o acesso a serviços e ambiente
    • Sistema de Arquivo (Exemplo: Se um roteirista descontentes decidiu apagar arquivos)
    • Banco de Dados (mesma coisa registros de dados Apagar)

Basicamente eu preciso para configurar o escopo javascript para incluir apenas exatamente o que precisam e nada mais.

Foi útil?

Solução

Para se proteger contra loops infinitos, você precisa colocá-lo em um processo separado para que ele poderia ser morto.

Para evitar a criação de threads, você precisa estender SecurityManager (a implementação padrão permite que o código não confiável para grupos de rosca acesso não-root).

A segurança Java não permite que você para impedir o acesso ao sistema de arquivos.

Para restrições de banco de dados, você pode ser capaz de usar a segurança do usuário SQL padrão, mas que é bastante fraco. Caso contrário, você precisa fornecer uma API que impõe suas restrições.

Edit:. Gostaria de salientar que a versão do Rhino fornecido com JDK6 tem o trabalho de segurança tinha feito sobre o assunto, mas não inclui o compilador

Outras dicas

Para se proteger contra loops infinitos, você pode observar a contagem de instruções como o script é executado (isto funciona apenas com scripts interpretados, e não com aqueles compilados).

Não é este exemplo no Rhino JavaDocs para impedir que um script de correr por mais de dez segundos:

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }

Para bloquear classe Java e acesso método de ter um olhar para ...

http://codeutopia.net/blog/2009 / 01/02 / sandboxing-rino-in-java /

Eu só corri em toda esta postagem no blog que parece ser útil para sandboxing mais ou menos qualquer coisa (não apenas Rhino):

http://calumleslie.blogspot.com/2008/06/ simple-jvm-sandboxing.html

Se você estiver procurando por funções de JavaScript puro somente, aqui é um basing solução no biblioteca Rhino JDK incorporado sem importar quaisquer bibliotecas 3rd-partes:

  1. Saiba JavaScript mecanismo de script nome da classe de fábrica ScriptEngineManager # getEngineFactories
  2. script de carregamento classe de fábrica de motores em um novo carregador de classe, em que JavaMembers ou outras classes relacionadas serão ignorados.
  3. Chamada #getScriptEngine na fábrica de motores de script carregado e scripts de eval no mecanismo de script retornado.

Se dado script contém Java script, classe loader vai tentar JavaMembers de carga ou de outras classes e classe gatilho não encontradas exceções. Desta forma, scripts maliciosos serão ignorados sem execução.

Por favor, leia arquivos ConfigJSParser.java e ConfigJSClassLoader.java para mais detalhes:

https://github.com/webuzz/simpleconfig/ árvore / master / src / im / webuzz / config

Javascript é single-threaded e não pode acessar o sistema de arquivos, então eu não acho que você precisa se preocupar com aqueles. Eu não tenho certeza se há uma maneira de definir um tempo limite para proteção contra loops infinitos, mas você pode sempre gerar um segmento (Java) que executa o script, e depois matar o fio depois de tanto tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top