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.

Respuestas a la pregunta(5)

Su respuesta a la pregunta