Pregunta

Estoy buscando una función de evaluación "segura" para implementar cálculos similares a hojas de cálculo (usando numpy/scipy).

La funcionalidad para hacer esto (la módulo rexec) se ha eliminado de Python desde 2.3 debido a problemas de seguridad aparentemente irreparables.Existen varios trucos de terceros que pretenden hacer esto; la solución mejor pensada que he encontrado esesta receta del libro de cocina de Python, "evaluación_segura".

¿Estoy razonablemente seguro si uso esto (o algo similar) para protegerme de códigos maliciosos, o tengo que escribir mi propio analizador?¿Alguien conoce alguna alternativa mejor?

EDITAR:acabo de descubrir Python restringido, que forma parte de Zope.Cualquier opinión sobre esto es bienvenida.

¿Fue útil?

Solución

Depende de tu definición de seguro, supongo.Gran parte de la seguridad depende de lo que usted pasa y de lo que se le permite pasar en el contexto.Por ejemplo, si se pasa un archivo, puedo abrir archivos arbitrarios:

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

Además, el entorno es muy restringido (no se pueden pasar módulos), por lo que no se puede simplemente pasar un módulo de funciones de utilidad como re o random.

Por otro lado, no necesita escribir su propio analizador, simplemente puede escribir su propio evaluador para Python ast:

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

De esa manera, con suerte, se podrían implementar importaciones seguras.La otra idea es utilizar Jython o IronPython y aprovechar las capacidades de espacio aislado de Java/.Net.

Otros consejos

¡Escribir tu propio analizador podría ser divertido!Podría ser una mejor opción porque las personas esperan usar la sintaxis familiar de la hoja de cálculo (Excel, etc.) y no Python cuando ingresan fórmulas.No estoy familiarizado con safe_eval pero me imagino que algo como esto ciertamente tiene potencial de explotación.

Aunque ese código parece bastante seguro, siempre he sostenido la opinión de que cualquier persona suficientemente motivada podría descifrarlo con el tiempo adecuado.Creo que se necesitará bastante determinación para superarlo, pero estoy relativamente seguro de que se podrá lograr.

Si simplemente necesita escribir y leer alguna estructura de datos en Python, y no necesita la capacidad real de ejecutar código personalizado, esta es la mejor opción:http://code.activestate.com/recipes/364469-safe-eval/

Garantiza que no se ejecuta ningún código, sólo se evalúan estructuras de datos estáticas:cadenas, listas, tuplas, diccionarios.

Daniel,Jinja implementa un entorno sandboxe que puede resultarle útil o no.Por lo que recuerdo, todavía no "comprende" la lista de comprensiones.

información de sanbox

La funcionalidad que desea está en los servicios del lenguaje del compilador, consultehttp://docs.python.org/library/language.htmlSi define su aplicación para que acepte solo expresiones, puede compilar la entrada como una expresión y obtener una excepción si no lo es, p.si hay punto y coma o formas de declaración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top