Ejecutar una funcion pasada como string
Hernan Martinez Foffani
hernan en orgmf.com.ar
Vie Jul 26 18:48:48 CEST 2002
[sobre eval()]
>
> Gracias, ahora lo pruebo. Podrias explicarme(explicarnos) el por
> que de ese diccionario como
> parametro? he mirado la doc y no pone mucho sobre los parametros
> opcionales con lo que no me queda
> claro por que pasamos ese diccionario como parametro :(
se puede usar para controlar la vision o el entorno que tiene el
codigo python que se le pasa a eval().
si tuvieramos dos funciones:
>>> def f_publica():
print "no pasa na"
>>> def funcion_peligrosa():
print "borra ficheros"
e invocamos a eval con un parametro:
>>> codigo = "f_publica()"
>>> eval(codigo)
no pasa na
>>>
pero tambien alguien no autorizado podría acceder a la
variable codigo e intentar ejecutar
>>> codigo = "f_peligrosa()"
>>> eval(codigo)
borra ficheros
>>>
o peor:
>>> codigo = "__builtins__.__import__('os').listdir('.')"
>>> eval(codigo)
['@test', 'BACKUP', 'copi2.py', 'DLLs', 'Doc', ...]
>>>
con el segundo parametro de eval podemos restringir cuales
son los objetos globales que eval puede "ver".
>>> eval("f_publica()", {"f_publica": f_publica})
no pasa na
>>>
hasta aqui hace lo que necesitamos. y no permite ejecutar:
>>> eval("f_peligrosa()", {"f_publica": f_publica})
Traceback (most recent call last):
File "<pyshell#23>", line 1, in ?
eval("f_peligrosa()", {"f_publica": f_publica})
File "<string>", line 0, in ?
NameError: name 'f_peligrosa' is not defined
>>>
>>> eval(codigo, {"f_publica": f_publica})
Traceback (most recent call last):
File "<pyshell#43>", line 1, in ?
eval(codigo, {"f_publica": f_publica})
File "<string>", line 0, in ?
AttributeError: 'dict' object has no attribute '__import__'
>>>
saludos,
-Hernan
Más información sobre la lista de distribución Python-es