Використання розміщення вмісту у заголовку відповіді HTTP


127

Я знайшов такий код asp.net дуже корисним при обслуговуванні файлів із бази даних:

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

Це дозволяє користувачеві зберегти файл на своєму комп’ютері, а потім вирішити, як його використовувати, а не браузер намагається використовувати файл.

Що ще можна зробити із заголовком відповіді щодо вмісту?


23
Зверніть увагу, що ваш зразок коду порушиться, якщо ім'я файлу містить пробіли або символи, що не належать до ASCII. Див. RFC 6266 для отримання додаткової інформації.
Джуліан Решке

@JulianReschke, Що з символами ASCII, які вважаються недрукованими? ( 0до 0x1F)
Pacerier

Прочитайте RFC 6266 (окрім того, що їх було б погано використовувати у імені файлу; одержувачі, швидше за все, викинуть їх у будь-який момент)
Julian Reschke

1
Ви можете використовувати пробіл, Unicode тощо. Якщо ви використовуєте подвійні лапки навколо імені. kb.mozillazine.org/…
Тоні БенБрахім

1
@Ronnie Overby Що таке вміст вмісту?
divy3993

Відповіді:


84

Зауважте, що RFC 6266 замінює RFC, на які посилається нижче. У розділі 7 викладено деякі пов'язані з цим проблеми безпеки.

Повноваження щодо заголовка диспозиції вмісту є RFC 1806 і RFC 2183. Люди також розробили хакерство щодо вмісту. Важливо зазначити, що заголовок вмісту-диспозиції не є частиною стандарту HTTP 1.1.

Стандарт HTTP 1.1 ( RFC 2616 ) також згадує можливі побічні ефекти розміщення вмісту:

15.5 Проблеми змістовної диспозиції

RFC 1806 [35], з якого походить часто реалізований
заголовок Content-Disposition (див. Розділ 19.5.1) у HTTP, має ряд дуже
серйозних міркувань щодо безпеки. Контент-диспозиція не є частиною
стандарту HTTP, але оскільки він широко застосовується, ми
документуємо його використання та ризики для виконавців. Докладніше див. У RFC 2183 [49]
(який оновлює RFC 1806).


31
Нині повноваженнями є RFC 6266.
Julian

@JulianReschke, Як працюють "заміщення" та "оновлення"? Чи новіші версії, такі як RFC 7230, також роблять RFC 6266 застарілим?
Печер'є

@Pacerier - чому RFC 7230 вплине на RFC 6266?
Джуліян Решке

@Julian, 1) З 6266 оновлення 2616, 2) 2616 застаріло до 723X, 3) Тоді 6266 також вважається застарілим?
Пейсьєр

5
Ну, RFC 5678 тут, RFC 9876 там. Якщо контент-диспозиція нахмуриться, то що нам використовувати замість цього?
Csaba Toth

25

Ну, схоже, що заголовок Content-Disposition був створений спочатку для електронної пошти, а не для Інтернету. ( Посилання на відповідний RFC .)

Я здогадуюсь, що веб-браузери можуть відповісти на це

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

при збереженні, але я не впевнений.



5

Для користувачів asp.net, .NET Framework пропонує клас для створення заголовка диспозиції вмісту: System.Net.Mime.ContentDisposition

Основне використання:

var cd = new System.Net.Mime.ContentDisposition();
cd.FileName = "myFile.txt";
cd.ModificationDate = DateTime.UtcNow;
cd.Size = 100;
Response.AppendHeader("content-disposition", cd.ToString());

1
Остерігайтеся, цей клас не відповідає RFC 6266 . Він виконує кодування UTF-8 base64 в filenameпараметрі замість використання filename*параметра з кодуванням RFC 5987 . Ніякого способу отримати або використовувати утиліти fx, щоб виправити це, майже все не можна перезаписати або внутрішнє ... У MVC 5.2 FileResultклас трохи кращий filename, але не обробляє інші параметри, тому що inlineбільшість його реалізацій також є внутрішніми ...
Фредерік,

2

Цей заголовок визначений в RFC 2183 , так що це було б найкращим місцем для початку читання.

Дозволені значення - це ті, які зареєстровані в Інтернеті з присвоєнням номерів (IANA); їх реєстр цінностей слід розглядати як остаточне джерело.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.