Usos da disposição do conteúdo em um cabeçalho de resposta HTTP

127

Eu achei o seguinte código asp.net muito útil ao servir arquivos de um banco de dados:

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

Isso permite que o usuário salve o arquivo no computador e decida como usá-lo, em vez de o navegador tentar usá-lo.

Que outras coisas podem ser feitas com o cabeçalho de resposta de disposição de conteúdo?

Ronnie Overby
fonte
23
Observe que seu código de amostra será interrompido se o nome do arquivo contiver caracteres em branco ou não ASCII. Veja RFC 6266 para mais informações.
Julian Reschke
@JulianReschke, e os caracteres ASCII considerados não imprimíveis? ( 0to 0x1F)
Pacerier
Leia RFC 6266 (além do fato de que seria uma má idéia para uso em um nome de arquivo; destinatários são susceptíveis de jogá-los fora de qualquer maneira)
Julian Reschke
1
Você pode usar espaço em branco, Unicode etc. se usar aspas duplas ao redor do nome. kb.mozillazine.org/…
Tony BenBrahim
1
@Ronnie Overby O que é Disposição de Conteúdo?
divy3993

Respostas:

84

Observe que o RFC 6266 substitui os RFCs mencionados abaixo. A Seção 7 descreve algumas das preocupações de segurança relacionadas.

A autoridade no cabeçalho da disposição do conteúdo é a RFC 1806 e a RFC 2183. As pessoas também criaram hackers para a disposição do conteúdo. É importante observar que o cabeçalho de disposição do conteúdo não faz parte do padrão HTTP 1.1.

O HTTP 1.1 Standard ( RFC 2616 ) também menciona os possíveis efeitos colaterais de segurança da disposição do conteúdo:

15.5 Problemas de disposição do conteúdo

A RFC 1806 [35], da qual
é derivado o cabeçalho Content-Disposition ( implementado na seção 19.5.1) no HTTP, geralmente implementado , possui várias
considerações de segurança muito sérias. A Disposição de Conteúdo não faz parte do
padrão HTTP, mas, como é amplamente implementado, estamos
documentando seu uso e riscos para os implementadores. Veja RFC 2183 [49]
(que atualiza a RFC 1806) para obter detalhes.

Andrew Austin
fonte
31
Hoje em dia, a autoridade é RFC 6266.
Julian Reschke
@JulianReschke, Como "substitui" e "atualiza" funciona? As versões mais recentes como o RFC 7230 também tornam o RFC 6266 obsoleto?
Pacerier
@Pacerier - por que o RFC 7230 afetaria o RFC 6266?
Julian Reschke
@Julian, 1) Desde 6266, as atualizações 2616, 2) 2616 foram tornadas obsoletas por 723X, 3) Então, 6266 também é considerado obsoleto?
Pacerier 5/05
5
Bem, a RFC 5678 aqui, a RFC 9876 lá. Se a Disposição de Conteúdo é mal vista, o que devemos usar?
precisa
25

Bem, parece que o cabeçalho Disposição de Conteúdo foi criado originalmente para email, não para a Web. ( Link para a RFC relevante .)

Suponho que os navegadores da web possam responder a

Response.AppendHeader("content-disposition", "inline; filename=" + fileName);

ao salvar, mas não tenho certeza.

MiffTheFox
fonte
5

Para usuários do asp.net, o .NET framework fornece uma classe para criar um cabeçalho de disposição de conteúdo: System.Net.Mime.ContentDisposition

Uso básico:

var cd = new System.Net.Mime.ContentDisposition();
cd.FileName = "myFile.txt";
cd.ModificationDate = DateTime.UtcNow;
cd.Size = 100;
Response.AppendHeader("content-disposition", cd.ToString());
ligado desligado
fonte
1
Cuidado, essa classe não está em conformidade com a RFC 6266 . Ele faz a codificação UTF-8 base64 no filenameparâmetro, em vez de usar o filename*parâmetro com a codificação RFC 5987 . Não há como derivar ou usar os utilitários FX para corrigir isso, quase tudo é irrecuperável ou interno ... O Net FX ainda tem um longo caminho para aprender abertura e extensibilidade. Em MVC 5.2, FileResultclasse faz um pouco melhor para filename, mas não lida com outros parâmetros como inlinee maior parte de sua implementação também é interna ...
Frédéric
2

Este cabeçalho é definido na RFC 2183 , portanto esse seria o melhor local para começar a ler.

Os valores permitidos são aqueles registrados na IANA (Internet Assigned Numbers Authority); seu registro de valores deve ser visto como a fonte definitiva.

NickFitz
fonte