Hola *.*,

Aprovecho que hay thread sobre eval para comentar también mis dudas.

Estoy trabajando en un sistema que me permita ejecutar de forma segura un código python que ha creado el usuario de la aplicación.

La idea es hacer un proceso intermedio entre la lectura de datos desde un archivo o base de datos, y el procesado de los mismos.

Mediante este proceso el usuario podría definir un código que evaluara los datos leídos y los manipulara antes de su procesado definitivo.

Este código solo debería tener acceso a las funcionas matemáticas y de string básicas para manipular los objetos que ha definido previamente la aplicación.

Para crear el entorno seguro estoy utilizando una receta que un listero envió hace bastante tiempo, sorry no recuerdo quien :(

    env={"__builtins__":__builtins__}
    exec "from cmath import *" in env
    env["__builtins__"]={}

    # agregar diccionario con datos a evaluar/manipular
    env["datos"]=dic

    # ejecutar
    exec codigo in env

En las pruebas realizadas funciona bien, pero me quedan las siguientes dudas:

1. Los datos que se permite manipular serán diccionarios y clases sencillas. Soy consciente que si algún método de las clases que incluya en el entorno hace 'cosas raras', podrá ejecutarlo, eso ya es responsabilidad mia.

Pero, ¿Es suficiente seguro esto?

Por ejemplo, si dentro del codigo de usuario pongo: 'datos.__class__.__module__' aparece: '__builtin__'. Es un string por lo que en principio no representa peligro, pero me asusta un poco que haya alguna otra cosa mediante la cual si pueda tener un acceso completo.


2. Curiosamente el codigo ejecutado en este entorno no reconoce True/False (NameError: global name 'False' is not defined).
Para poder utilizarlos he tenido a agregar al entorno lo siguiente:

    env["True"] = True
    env["False"] = False

¿Es correcto hacerlo asi?

Gracias,
--
Oswaldo Hernández
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a