[Python-es] exec seguro

Oswaldo Hernández listas en soft-com.es
Vie Mayo 7 19:35:52 CEST 2010


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



Más información sobre la lista de distribución Python-es