É "safe_eval" realmente seguro?

votos
3

Eu estou procurando uma função eval seguro, para implementar cálculos de planilha semelhante (usando numpy / scipy).

A funcionalidade para fazer esta (o módulo Rexec ) foi removido a partir do Python desde 2,3 devido a problemas de segurança, aparentemente unfixable. Existem vários hacks de terceiros lá fora que se propõem a fazer isso - a solução mais pensado que eu encontrei é esta receita Python Cookbok , safe_eval.

Estou razoavelmente seguro se eu usar este (ou algo similar), para proteger de código malicioso, ou estou preso com escrever meu próprio analisador? Alguém sabe de quaisquer alternativas melhores?

EDIT: Eu só descobri RestrictedPython , que faz parte do Zope. Quaisquer opiniões sobre este são bem-vindos.

Publicado 26/08/2008 em 16:27
fonte usuário
Em outras línguas...                            


6 respostas

votos
2

Escrever seu próprio analisador poderia ser divertido! Pode ser uma opção melhor porque as pessoas estão esperando para usar a sintaxe familiar planilha (Excel, etc) e não Python quando eles estão entrando em fórmulas. Eu não estou familiarizado com safe_eval mas eu poderia imaginar que algo como isso certamente tem o potencial de exploração.

Respondeu 26/08/2008 em 16:44
fonte usuário

votos
1

Se você simplesmente precisa escrever e ler alguma estrutura de dados em Python, e não precisam da capacidade real de execução de código personalizado, este é um ajuste melhor: http://code.activestate.com/recipes/364469-safe -EVAL /

Ele garantees que nenhum código é executado, apenas a estruturas de dados estáticos são avaliados: cordas, listas, tuplas, dictionnaries.

Respondeu 02/08/2011 em 10:19
fonte usuário

votos
1

Depende da sua definição de seguro suponho. Um monte de segurança depende do que você passar eo que você está autorizado a passar no contexto. Por exemplo, se um arquivo é passado, eu 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 restrita (que não pode passar em módulos), assim, não se pode simplesmente passar em um módulo de funções de utilidades como re ou aleatória.

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

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

Dessa forma, espera-se, você poderia implementar importações seguros. A outra idéia é usar Jython ou IronPython e tirar proveito dos recursos sandboxing Java / .Net.

Respondeu 28/08/2008 em 12:35
fonte usuário

votos
1

Embora esse código parece muito seguro, eu sempre tinha a opinião de que qualquer pessoa suficientemente motivados poderia quebrá-lo dado tempo suficiente. Eu acho que vai demorar um pouco de determinação para passar por isso, mas eu sou relativamente certeza de que poderia ser feito.

Respondeu 27/08/2008 em 03:37
fonte usuário

votos
0

A funcionalidade que você quer é nos serviços linguísticos compilador, consulte http://docs.python.org/library/language.html Se você definir seu aplicativo para aceitar apenas expressões, você pode compilar a entrada como uma expressão e obter uma exceção se não é, por exemplo, se há ponto e vírgula ou formas de instrução.

Respondeu 06/01/2012 em 23:41
fonte usuário

votos
0

Daniel, Jinja implementa um ambiente sandboxe que podem ou não ser útil. Pelo que me lembro, ele ainda não "compreender" compreensões lista.

informações SANbox

Respondeu 28/08/2008 em 11:12
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more