¿Hay fallos de seguridad que podrían ocurrir en este escenario:Seguridad de Python 'eval' Para Lista Deserialización
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
donde unsanitized_user_input
es un objeto str. La cadena es generada por el usuario y podría ser desagradable. Asumiendo que nuestro framework web no nos ha fallado, es una instancia real honesta a Dios de los builtins de Python.
Si esto es peligroso, ¿podemos hacer algo al respecto para que sea seguro?
Definitivamente no queremos ejecutar cualquier cosa contenida en la cadena.
Consulte también:
El contexto más amplio que es (creo) no es esencial para la cuestión 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 son ellos mismos convertidos en cadenas con repr()
, puesto en almacenamiento persistente, y con el tiempo de lectura de retorno en la memoria con eval.
Evaluar deserializar 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.
"La razón para hacer esto tendría mucho más sentido si presentara el contexto más amplio" ¿Podría explicar el problema por favor? Actualmente, el comando parece completamente inútil, al igual que no hacer nada con 'unsunitized_user_input' .. – dbr
" tenemos miles de estos "Eso no tiene sentido. ¿Por qué almacenaría la entrada de esa manera? No tiene sentido volver a escribir una cadena para fines de almacenamiento. – Miles
¿Por qué no usa pickle o algo más simple? –