Utilisations de la disposition du contenu dans un en-tête de réponse HTTP

127

J'ai trouvé le code asp.net suivant très utile lors de la diffusion de fichiers à partir d'une base de données:

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

Cela permet à l'utilisateur d'enregistrer le fichier sur son ordinateur, puis de décider comment l'utiliser, au lieu que le navigateur essaie d'utiliser le fichier.

Que peut-on faire d'autre avec l'en-tête de réponse content-disposition?

Ronnie Overby
la source
23
Notez que votre exemple de code sera interrompu si le nom de fichier contient des espaces ou des caractères non ASCII. Voir RFC 6266 pour plus d'informations.
Julian Reschke le
@JulianReschke, Qu'en est-il des caractères ASCII considérés comme non imprimables? ( 0to 0x1F)
Pacerier
Lisez la RFC 6266 (à part le fait qu'ils seraient une mauvaise idée à utiliser dans un nom de fichier; les destinataires sont susceptibles de les jeter de toute façon)
Julian Reschke
1
Vous pouvez utiliser des espaces blancs, Unicode etc. si vous utilisez des guillemets doubles autour du nom. kb.mozillazine.org
Tony BenBrahim
1
@Ronnie Overby Qu'est-ce que la disposition du contenu?
divy3993

Réponses:

84

Notez que la RFC 6266 remplace les RFC référencées ci-dessous. La section 7 décrit certaines des préoccupations liées à la sécurité.

L'autorité sur l'en-tête de disposition de contenu est RFC 1806 et RFC 2183. Les gens ont également conçu le piratage de disposition de contenu. Il est important de noter que l'en-tête content-disposition ne fait pas partie de la norme HTTP 1.1.

La norme HTTP 1.1 ( RFC 2616 ) mentionne également les effets secondaires possibles de la disposition du contenu sur la sécurité:

15.5 Problèmes de disposition du contenu

La RFC 1806 [35], à partir de laquelle l'en-
tête Content-Disposition souvent implémenté (voir la section 19.5.1) dans HTTP est dérivé, a un certain nombre de
considérations de sécurité très sérieuses. Content-Disposition ne fait pas partie du
standard HTTP, mais comme il est largement implémenté, nous
documentons son utilisation et ses risques pour les implémenteurs. Voir RFC 2183 [49]
(qui met à jour la RFC 1806) pour plus de détails.

Andrew Austin
la source
31
De nos jours, l'autorité est RFC 6266.
Julian Reschke
@JulianReschke, Comment fonctionnent les "substitutions" et les "mises à jour"? Est-ce que des versions plus récentes comme la RFC 7230 rendent également la RFC 6266 obsolète?
Pacerier
@Pacerier - Pourquoi la RFC 7230 affecterait-elle la RFC 6266?
Julian Reschke
@Julian, 1) Depuis 6266 mises à jour 2616, 2) 2616 a été rendu obsolète par 723X, 3) Alors, 6266 est-il également considéré comme obsolète?
Pacerier
5
Eh bien, RFC 5678 ici, RFC 9876 là. Si Content-Disposition est mal vu, que devrions-nous utiliser à la place?
Csaba Toth
25

Eh bien, il semble que l'en-tête Content-Disposition ait été créé à l'origine pour le courrier électronique, pas pour le Web. ( Lien vers la RFC pertinente .)

Je suppose que les navigateurs Web peuvent répondre à

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

lors de l'enregistrement, mais je ne suis pas sûr.

MiffTheFox
la source
5

Pour les utilisateurs asp.net, le framework .NET fournit une classe pour créer un en-tête de disposition de contenu: System.Net.Mime.ContentDisposition

Utilisation de base:

var cd = new System.Net.Mime.ContentDisposition();
cd.FileName = "myFile.txt";
cd.ModificationDate = DateTime.UtcNow;
cd.Size = 100;
Response.AppendHeader("content-disposition", cd.ToString());
sur
la source
1
Attention, cette classe n'est pas conforme à la RFC 6266 . Il effectue le codage UTF-8 base64 en filenameparamètre, au lieu d'utiliser le filename*paramètre avec le codage RFC 5987 . Aucun moyen de dériver ou d'utiliser des utilitaires fx pour résoudre ce problème, presque tout est non remplaçable ou interne ... .Net fx a encore un long chemin à apprendre sur l'ouverture et l'extensibilité. Dans MVC 5.2, la FileResultclasse fait un peu mieux pour filename, mais ne gère pas les autres paramètres car la inlineplupart de son implémentation est également interne ...
Frédéric
2

Cet en-tête est défini dans la RFC 2183 , ce serait donc le meilleur endroit pour commencer la lecture.

Les valeurs autorisées sont celles enregistrées auprès de l 'Internet Assigned Numbers Authority (IANA); leur registre de valeurs doit être considéré comme la source définitive.

NickFitz
la source