Pergunta

Estou procurando uma função de avaliação "segura", para implementar cálculos semelhantes a planilhas (usando numpy/scipy).

A funcionalidade para fazer isso (o módulo rexec) foi removido do Python desde 2.3 devido a problemas de segurança aparentemente insolúveis.Existem vários hacks de terceiros que pretendem fazer isso - a solução mais bem pensada que encontrei éesta receita do Python Cookbok, "avaliação_segura".

Estou razoavelmente seguro se usar isso (ou algo semelhante) para me proteger contra códigos maliciosos ou estou preso em escrever meu próprio analisador?Alguém conhece alguma alternativa melhor?

EDITAR:acabei de descobrir RestritoPython, que faz parte do Zope.Quaisquer opiniões sobre isso são bem-vindas.

Foi útil?

Solução

Depende da sua definição de seguro, suponho.Grande parte da segurança depende do que você passa e do que tem permissão para passar no contexto.Por exemplo, se um arquivo for transmitido, posso abrir arquivos arbitrários:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

Além disso, o ambiente é muito restrito (você não pode passar módulos), portanto, você não pode simplesmente passar um módulo de funções utilitárias como re ou random.

Por outro lado, você não precisa escrever seu próprio analisador, você pode simplesmente escrever seu próprio avaliador para o python ast:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

Dessa forma, esperamos que você possa implementar importações seguras.A outra ideia é usar Jython ou IronPython e aproveitar as vantagens dos recursos de sandbox Java/.Net.

Outras dicas

Escrever seu próprio analisador pode ser divertido!Pode ser uma opção melhor porque as pessoas esperam usar a sintaxe familiar da planilha (Excel, etc.) e não o Python ao inserir fórmulas.Não estou familiarizado com safe_eval, mas imagino que algo assim certamente tem potencial para exploração.

Embora esse código pareça bastante seguro, sempre tive a opinião de que qualquer pessoa suficientemente motivada poderia quebrá-lo com tempo adequado.Acho que será preciso um pouco de determinação para superar isso, mas tenho relativa certeza de que isso pode ser feito.

Se você simplesmente precisa escrever e ler alguma estrutura de dados em Python e não precisa da capacidade real de executar código personalizado, esta é a melhor opção:http://code.activestate.com/recipes/364469-safe-eval/

Garante que nenhum código seja executado, apenas estruturas de dados estáticas sejam avaliadas:strings, listas, tuplas, dicionários.

Daniel,Jinja implementa um ambiente sandbox que pode ou não ser útil para você.Pelo que me lembro, ele ainda não "compreende" a compreensão da lista.

Informações sobre Sanbox

A funcionalidade que você deseja está nos serviços de linguagem do compilador, consultehttp://docs.python.org/library/idioma.htmlSe você definir seu aplicativo para aceitar apenas expressões, poderá compilar a entrada como uma expressão e obter uma exceção se não for, por exemplo.se houver ponto e vírgula ou formulários de declaração.

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