¿Puede la cadena .format () de Python ser segura para cadenas de formato que no son de confianza?

Estoy trabajando en una aplicación web donde los usuarios podrán suministrar cadenas en las que el servidor sustituirá las variables.

Preferiblemente, me gustaría usar la sintaxis del formato PEP 3101 () y estoy analizando la posibilidad de reemplazar los métodos en Formatter para que sea seguro para una entrada no confiable.

Estos son los riesgos que puedo ver con .format () tal como está:

El relleno le permite especificar longitudes arbitrarias, por lo que '{:> 9999999999}'. Formato (..) podría ejecutar el servidor sin memoria y ser un DOS. Necesito deshabilitar esto.El formato le permite acceder a los campos dentro de los objetos, lo cual es útil, pero es espeluznante que pueda acceder a las variables dunder y comenzar a perforar bits de la biblioteca estándar. No se sabe dónde puede haber un getattr () que tenga efectos secundarios o que devuelva algo secreto. Yo pondría en la lista blanca de atributos / acceso al índice reemplazando a get_field ().Tendría que atrapar algunas excepciones, naturalmente.

Mis suposiciones son:

Ninguna de las explotaciones de cadena de formato C tradicionales se aplica a Python, ya que especificar un parámetro es un acceso controlado por límites en una colección, en lugar de saltar directamente de la pila del hilo.El marco web que estoy usando escapa a todas las variables que se sustituyen en una plantilla de página, y siempre que sea la última parada antes de la salida, estoy a salvo de los ataques de secuencias de comandos entre sitios que surjan de la eliminación de escapes.

¿Cuáles son tus pensamientos? ¿Posible? ¿Imposible? ¿Simplemente imprudente?

Edit: Armin Ronacher describe una fuga de información desagradable si no filtra el acceso variable de dunder, pero parece considerar el formato de seguridad () como posible:

{local_foo.__init__.__globals__[secret_global]}

http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

(Personalmente, no fui a la ruta de formato no confiable () en mi producto, pero estoy actualizando para completar)

Respuestas a la pregunta(1)

Su respuesta a la pregunta