Seguridad de Python 'eval' para la lista de deserialización
¿Hay alguna vulnerabilidad de seguridad que pueda ocurrir en este escenario?
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
dóndeunsanitized_user_input
es un objeto str. La cadena es generada por el usuario y podría ser desagradable. Suponiendo que nuestro marco web no nos haya fallado, es una verdadera instancia de cadena honesta a dios de las incorporaciones de Python.
Si esto es peligroso, ¿podemos hacer algo a la entrada para hacerlo seguro?
Nosotros definitivamenteno hacer desea ejecutar cualquier cosa contenida en la cadena.
Ver también:
Divertida publicación de blog sobre la seguridad evalPregunta anteriorBlog: Deserialización rápida en Python.El contexto más amplio que no creo que sea esencial para la pregunta es que tenemos miles de estos:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
en algunos casos anidados:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
que a su vez se convierten en cuerdas conrepr()
, poner en almacenamiento persistente, y finalmente leer de nuevo en la memoria con eval.
Eval deserializó las cadenas de almacenamiento persistente mucho más rápido que pickle y simplejson. El intérprete es Python 2.5, por lo que json y ast no están disponibles. No se permiten módulos C y cPickle no está permitido.