A string .format () do Python pode ser segura para strings de formato não confiáveis?

Estou trabalhando em um aplicativo da web em que os usuários poderão fornecer strings às quais o servidor substituirá as variáveis.

De preferência, gostaria de usar a sintaxe do formato PEP 3101 () e estou analisando a possibilidade de substituir métodos no Formatador para torná-lo seguro para entradas não confiáveis.

Aqui estão os riscos que posso ver com .format () como está:

O padding permite que você especifique comprimentos arbitrários, então o formato '{:> 9999999999}' (..) pode deixar o servidor sem memória e ser um DOS. Eu precisaria desabilitar isso.O formato permite que você acesse os campos dentro dos objetos, o que é útil, mas é assustador que você possa acessar variáveis ​​dunder e começar a perfurar em bits da biblioteca padrão. Não há como dizer onde pode haver um getattr () que tenha efeitos colaterais ou retorne algo secreto. Eu colocaria na lista de permissões acesso de atributo / índice substituindo get_field ().Eu precisaria pegar algumas exceções, naturalmente.

Minhas suposições são:

Nenhuma das explorações de string de formato C tradicionais se aplicam ao Python, porque a especificação de um parâmetro é um acesso com verificação de limites em uma coleção, em vez de aparecer diretamente na pilha do encadeamento.A estrutura da Web que estou usando escapa de todas as variáveis ​​que são substituídas em um modelo de página e, desde que seja a última parada antes da saída, estou protegido contra ataques de script entre sites que surgem do escape.

Quais são seus pensamentos? Possível? Impossível? Apenas imprudente?

Edit: Armin Ronacher descreve um vazamento de informações desagradável se você não filtrar o acesso a variáveis ​​dunder, mas parece considerar o formato de segurança () como viável:

{local_foo.__init__.__globals__[secret_global]}

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

(Pessoalmente, eu não fui realmente a rota de formato não confiável () no meu produto, mas estou atualizando por uma questão de integridade)

questionAnswers(1)

yourAnswerToTheQuestion