Использование content-disposition в заголовке HTTP-ответа

Я обнаружил, что следующий код asp.net очень полезен при обслуживании файлов из базы данных:

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

Это позволяет пользователю сохранить файл на свой компьютер, а затем решить, как его использовать, вместо того, чтобы браузер пытался использовать файл.

Что еще можно сделать с заголовком ответа Content-Disposition?


person Ronnie Overby    schedule 18.06.2009    source источник
comment
Обратите внимание, что ваш пример кода сломается, если имя файла содержит пробелы или символы, отличные от ASCII. См. RFC 6266 для получения дополнительной информации.   -  person Julian Reschke    schedule 02.09.2011
comment
@JulianReschke, как насчет символов ASCII, которые считаются непечатаемыми? (С 0 по 0x1F)   -  person Pacerier    schedule 05.02.2015
comment
Прочтите RFC 6266 (кроме того факта, что их было бы плохой идеей использовать в имени файла; получатели, скорее всего, все равно их выбросят)   -  person Julian Reschke    schedule 05.02.2015
comment
Вы можете использовать пробелы, Unicode и т. Д., Если вы используете двойные кавычки вокруг имени. kb.mozillazine.org/   -  person Tony BenBrahim    schedule 29.03.2016
comment
@Ronnie Overby Что такое размещение контента?   -  person divy3993    schedule 23.06.2016


Ответы (5)


Обратите внимание, что RFC 6266 заменяет RFC, указанные ниже. Раздел 7 описывает некоторые связанные с этим проблемы безопасности.

Правомочность заголовка Content-Disposition - RFC 1806 и RFC 2183. Люди также придумали взлом content-disposition. Важно отметить, что заголовок content-disposition не является частью стандарта HTTP 1.1.

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

15.5 Проблемы с размещением контента

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

person Andrew Austin    schedule 18.06.2009
comment
В настоящее время это RFC 6266. - person Julian Reschke; 02.09.2011
comment
@JulianReschke, как работают замены и обновления? Считают ли более новые версии, такие как RFC 7230, RFC 6266 устаревшим? - person Pacerier; 10.12.2014
comment
@Pacerier - почему RFC 7230 влияет на RFC 6266? - person Julian Reschke; 10.12.2014
comment
@Julian, 1) Начиная с 6266 обновлений 2616, 2) 2616 был сделан устаревшим 723X, 3) Тогда 6266 также считается устаревшим ? - person Pacerier; 05.02.2015
comment
Если бы 723X сделал 6266 устаревшим, то он сделал бы 6216 устаревшим. - person vol7ron; 08.10.2015
comment
Ну, RFC 5678 здесь, RFC 9876 там. Если Content-Disposition не одобряют, что мы должны использовать вместо этого? - person Csaba Toth; 20.03.2016

Что ж, похоже, что заголовок Content-Disposition изначально создавался для электронной почты, а не для Интернета. (Ссылка на соответствующий RFC.)

Я предполагаю, что веб-браузеры могут реагировать на

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

при сохранении, но не уверен.

person MiffTheFox    schedule 18.06.2009

См. RFC 6266 (Использование поля заголовка Content-Disposition в протоколе передачи гипертекста (HTTP)) http://tools.ietf.org/html/rfc6266

person Manish Pai    schedule 01.03.2013

Для пользователей asp.net платформа .NET предоставляет класс для создания заголовка размещения контента: 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());
person onof    schedule 06.03.2014
comment
Остерегайтесь, этот класс не соответствует RFC 6266. Он выполняет кодировку base64 UTF-8 в параметре filename вместо использования параметра filename* с кодировкой RFC 5987 . Невозможно получить или использовать утилиты fx, чтобы исправить это, почти все не является переопределяемым или внутренним ... .Net fx еще предстоит пройти долгий путь изучения открытости и расширяемости. В MVC 5.2 класс FileResult работает немного лучше для filename, но не обрабатывает другие параметры как inline, и большая часть его реализации также является внутренней ... - person Frédéric; 19.01.2016

Этот заголовок определен в RFC 2183, так что это лучшее место для начала чтения .

Допустимые значения - это те, которые зарегистрированы в Управлении по присвоению номеров в Интернете (IANA); их реестр значений следует рассматривать как исчерпывающий источник.

person NickFitz    schedule 18.06.2009