Estuvimos investigando en el mundo on line y así tener para ti la solución a tu problema, si continúas con inquietudes deja la inquietud y te contestamos con mucho gusto.
Solución:
La función eval permite que un programa Python ejecute código Python dentro de sí mismo.
ejemplo de eval (shell interactivo):
>>> x = 1
>>> eval('x + 1')
2
>>> eval('x')
1
eval()
interpreta un string como código. La razón por la que tanta gente le ha advertido sobre el uso de esto es porque un usuario puede usarlo como una opción para ejecutar código en la computadora. Si usted tiene eval(input())
y os
importado, una persona podría escribir en input()
os.system('rm -R *')
que eliminaría todos sus archivos en su directorio de inicio. (Suponiendo que tiene un sistema Unix). Utilizando eval()
es un agujero de seguridad. Si necesita convertir cadenas a otros formatos, intente usar cosas que hagan eso, como int()
.
Muchas buenas respuestas aquí, pero ninguna describe el uso de eval()
en el contexto de su globals
y locals
kwargs, es decir eval(expression, globals=None, locals=None)
(ver documentos para eval
aquí).
Estos se pueden utilizar para limitar las funciones que están disponibles a través del eval
función. Por ejemplo, si carga un nuevo intérprete de python, el locals()
y globals()
será el mismo y se verá algo como esto:
>>>globals()
'__loader__': , '__doc__': None,
'__spec__': None, '__builtins__': ,
'__package__': None, '__name__': '__main__'
Ciertamente hay funciones dentro de la builtins
módulo que puede causar un daño significativo a un sistema. Pero es posible bloquear cualquier cosa y todo lo que no queremos que esté disponible. Tomemos un ejemplo. Digamos que queremos construir una lista para representar un dominio de los núcleos disponibles en un sistema. Para mi tengo 8 cores asi que me gustaria una lista [1, 8]
.
>>>from os import cpu_count
>>>eval('[1, cpu_count()]')
[1, 8]
Así mismo todos __builtins__
está disponible.
>>>eval('abs(-1)')
1
Está bien. Ahí vemos una función que queremos exponer y un ejemplo de un método (de muchos que pueden ser mucho más complejos) que no queremos exponer. Así que bloqueemos todo.
>>>eval('[1, cpu_count()]', '__builtins__':None, )
TypeError: 'NoneType' object is not subscriptable
Hemos bloqueado efectivamente todos los __builtins__
funciones y como tal trajo un nivel de protección a nuestro sistema. En este punto, podemos comenzar a agregar funciones que queremos exponer.
>>>from os import cpu_count
>>>exposed_methods = 'cpu_count': cpu_count
>>>eval('cpu_count()', '__builtins__':None, exposed_methods)
8
>>>eval('abs(cpu_count())', '__builtins__':None, exposed_methods)
TypeError: 'NoneType' object is not subscriptable
Ahora tenemos el cpu_count
función disponible sin dejar de bloquear todo lo que no queremos. En mi opinión, esto es súper poderoso y claramente desde el alcance de las otras respuestas, no es una implementación común. Hay numerosos usos para algo como esto y mientras se maneje correctamente, personalmente siento eval
se puede utilizar con seguridad a gran valor.
nótese bien
Algo más que es genial acerca de estos kwargs
es que puedes empezar a usar abreviaturas para tu código. Supongamos que usa eval como parte de una canalización para ejecutar algún texto importado. El texto no necesita tener un código exacto, puede seguir algún formato de archivo de plantilla y aun así ejecutar cualquier cosa que desee. Por ejemplo:
>>>from os import cpu_count
>>>eval('[1,cores]', '__builtins__': None, 'cores': cpu_count())
[1, 8]
Calificaciones y comentarios
Al final de la artículo puedes encontrar las explicaciones de otros programadores, tú igualmente tienes la habilidad insertar el tuyo si te gusta.