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