Usos de disposición de contenido en un encabezado de respuesta HTTP

127

He encontrado que el siguiente código asp.net es muy útil cuando se sirven archivos de una base de datos:

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

Esto permite al usuario guardar el archivo en su computadora y luego decidir cómo usarlo, en lugar de que el navegador intente usar el archivo.

¿Qué otras cosas se pueden hacer con el encabezado de respuesta de disposición de contenido?

Ronnie Overby
fuente
23
Tenga en cuenta que su código de muestra se romperá si el nombre de archivo contiene espacios en blanco o caracteres no ASCII. Vea RFC 6266 para más información.
Julian Reschke
@JulianReschke, ¿Qué pasa con los caracteres ASCII que se consideran no imprimibles? ( 0to 0x1F)
Pacerier
Lea el RFC 6266 (aparte del hecho de que sería una mala idea usarlo en un nombre de archivo; es probable que los destinatarios los
descarten de
1
Puede usar espacios en blanco, Unicode, etc. si usa comillas dobles alrededor del nombre. kb.mozillazine.org/…
Tony BenBrahim
1
@Ronnie Overby ¿Qué es la disposición de contenido?
divy3993

Respuestas:

84

Tenga en cuenta que RFC 6266 reemplaza a los RFC a los que se hace referencia a continuación. La Sección 7 describe algunos de los problemas de seguridad relacionados.

La autoridad en el encabezado de disposición de contenido es RFC 1806 y RFC 2183. La gente también ha ideado la piratería de disposición de contenido. Es importante tener en cuenta que el encabezado de disposición de contenido no forma parte del estándar HTTP 1.1.

El estándar HTTP 1.1 ( RFC 2616 ) también menciona los posibles efectos secundarios de seguridad de la disposición del contenido:

15.5 Problemas de disposición de contenido

RFC 1806 [35], del cual
se deriva el encabezado Content-Disposition (ver sección 19.5.1) a menudo implementado en HTTP, tiene una serie de
consideraciones de seguridad muy serias. Content-Disposition no es parte del
estándar HTTP, pero dado que está ampliamente implementado, estamos
documentando su uso y riesgos para los implementadores. Ver RFC 2183 [49]
(que actualiza RFC 1806) para más detalles.

Andrew Austin
fuente
31
Hoy en día, la autoridad es RFC 6266.
Julian Reschke
@JulianReschke, ¿Cómo funcionan las "sustituciones" y las "actualizaciones"? ¿Las versiones más recientes como RFC 7230 también hacen que RFC 6266 sea obsoleto?
Pacerier
@Pacerier: ¿por qué RFC 7230 afectaría a RFC 6266?
Julian Reschke
@Julian, 1) Desde 6266 actualizaciones 2616, 2) 2616 ha quedado obsoleto por 723X, 3) Entonces, ¿6266 también se considera obsoleto?
Pacerier
55
Bueno, RFC 5678 aquí, RFC 9876 allí. Si Content-Disposition está mal visto, ¿qué deberíamos usar en su lugar?
Csaba Toth
25

Bueno, parece que el encabezado Content-Disposition se creó originalmente para el correo electrónico, no para la web. ( Enlace a RFC relevante ).

Supongo que los navegadores web pueden responder a

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

al guardar, pero no estoy seguro.

MiffTheFox
fuente
5

Para los usuarios de asp.net, .NET Framework proporciona una clase para crear un encabezado de disposición de contenido: 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());
onof
fuente
1
Cuidado, esta clase no cumple con RFC 6266 . Hace la codificación UTF-8 base64 en el filenameparámetro, en lugar de usar el filename*parámetro con la codificación RFC 5987 . No hay forma de derivar o usar las utilidades de fx para arreglar eso, casi todo es no reemplazable o interno ... .Net fx todavía tiene un largo camino para aprender apertura y extensibilidad. En MVC 5.2, la FileResultclase mejora un poco filename, pero no maneja otros parámetros, inliney la mayor parte de su implementación también es interna ...
Frédéric
2

Este encabezado se define en RFC 2183 , por lo que sería el mejor lugar para comenzar a leer.

Los valores permitidos son aquellos registrados con la Autoridad de Números Asignados de Internet (IANA); su registro de valores debe verse como la fuente definitiva.

NickFitz
fuente