[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