Si estoy evaluando una cadena Python usando eval(), y tengo una clase como:Security of Python's eval() en cadenas no confiables?
class Foo(object):
a = 3
def bar(self, x): return x + a
¿Cuáles son los riesgos de seguridad si no confían en la cuerda? En particular:
- ¿Es inseguro
eval(string, {"f": Foo()}, {})
? Es decir, ¿puede llegar a os o sys o algo inseguro desde una instancia de Foo? - ¿
eval(string, {}, {})
no es seguro? Es decir, ¿puedo llegar a os o sys por completo desde edificios como len y list? - ¿Hay alguna manera de hacer que las construcciones internas no estén presentes en el contexto de evaluación?
Hay algunas cadenas inseguras como "[0] * 100000000" No me importa, porque en el peor de los casos ralentiza/detiene el programa. Me preocupa principalmente proteger los datos del usuario externos al programa.
Obviamente, eval(string)
sin diccionarios personalizados es inseguro en la mayoría de los casos.
sí, si hay importación sys sys.dostuff en la cadena que está haciendo eval y usted no confía en las cuerdas, las cosas pueden ponerse realmente feas. – Vasil
eval tiene la propiedad agradable solo permite expresiones. Entonces cosas como =, importar e imprimir no están permitidas. –
Pruebe 'eval ('__ import __ (" sys "). Stdout.write (" Hola Joe ")')' –