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

127

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

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

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

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

Ронни Оверби
источник
23
Обратите внимание, что ваш пример кода сломается, если имя файла содержит пробелы или символы, отличные от ASCII. См. RFC 6266 для получения дополнительной информации.
Джулиан Решке
@JulianReschke, А как насчет символов ASCII, которые считаются непечатаемыми? ( 0to 0x1F)
Pacerier
Прочтите RFC 6266 (кроме того факта, что их было бы плохой идеей использовать в имени файла; получатели, скорее всего, все равно их выбросят)
Джулиан Решке
1
Вы можете использовать пробелы, Unicode и т. Д., Если вы используете двойные кавычки вокруг имени. kb.mozillazine.org/…
Tony BenBrahim
1
@Ronnie Overby Что такое размещение контента?
divy3993

Ответы:

84

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

Право на заголовок размещения контента - RFC 1806 и RFC 2183. Люди также разработали хакерские методы управления содержимым. Важно отметить, что заголовок 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).

Эндрю Остин
источник
31
В настоящее время официальным лицом является RFC 6266.
Джулиан Решке
@JulianReschke, как работает "заменяет" и "обновляет"? Считают ли более новые версии, такие как RFC 7230, RFC 6266 устаревшим?
Pacerier
@Pacerier - почему RFC 7230 влияет на RFC 6266?
Джулиан Решке
@Julian, 1) С момента обновления 6266 2616, 2) 2616 был сделан устаревшим 723X, 3) Тогда 6266 также считается устаревшим?
Pacerier
5
Ну, RFC 5678 здесь, RFC 9876 там. Если Content-Disposition не одобряют, что мы должны использовать вместо этого?
Csaba Toth
25

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

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

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

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

MiffTheFox
источник
5

Для пользователей 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());
onof
источник
1
Остерегайтесь, этот класс не соответствует RFC 6266 . Он выполняет кодировку base64 UTF-8 в filenameпараметре вместо использования filename*параметра с кодировкой RFC 5987 . Невозможно получить или использовать утилиты fx, чтобы исправить это, почти все не является переопределяемым или внутренним ... .Net fx еще предстоит изучить открытость и расширяемость. В MVC 5.2 FileResultкласс работает немного лучше filename, но не обрабатывает другие параметры, inlineи большая часть его реализации также является внутренней ...
Фредерик,
2

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

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

NickFitz
источник