メインコンテンツまでスキップ

4. ヘッダーフィールド定義 (Header Field Definition)

Content-Dispositionレスポンスヘッダーフィールド (Response Header Field) は、レスポンスペイロード (Response Payload) の処理方法に関する追加情報を伝達するために使用され、またレスポンスペイロードをローカルに保存する際に使用するファイル名 (Filename) などの追加メタデータ (Metadata) を添付するためにも使用できます。

4.1. 文法 (Grammar)

content-disposition = "Content-Disposition" ":"
disposition-type *( ";" disposition-parm )

disposition-type = "inline" | "attachment" | disp-ext-type
; case-insensitive (大文字小文字を区別しない)
disp-ext-type = token

disposition-parm = filename-parm | disp-ext-parm

filename-parm = "filename" "=" value
| "filename*" "=" ext-value

disp-ext-parm = token "=" value
| ext-token "=" ext-value
ext-token = <tokenの文字の後に "*" が続く>

[RFC2616]で定義:

token         = <token, [RFC2616]のセクション2.2で定義>
quoted-string = <quoted-string, [RFC2616]のセクション2.2で定義>
value = <value, [RFC2616]のセクション3.6で定義>
; token | quoted-string

[RFC5987]で定義:

ext-value   = <ext-value, [RFC5987]のセクション3.2で定義>

同じパラメータ名 (Parameter Name) の複数のインスタンスを持つContent-Dispositionヘッダーフィールド値は無効です。

暗黙的な線形空白 (Linear Whitespace) の規則 ([RFC2616]のセクション2.1) により、オプションの空白 (OPTIONAL Whitespace) がワード (word) (tokenまたはquoted-string) と区切り文字の間に出現できることに注意してください。

さらに、ext-valueに使用される形式により、自然言語 (Natural Language) (例: "en") を指定できることに注意してください。これはファイル名にとって限定的な用途しかなく、受信者によって無視される可能性があります。

4.2. 処置タイプ (Disposition Type)

処置タイプ (Disposition Type) が "attachment" に一致する場合 (大文字小文字を区別しない)、これは受信者が (メディアタイプ (Media Type) に従って) 通常の処理を行うのではなく、レスポンスをローカルに保存するようユーザーに促すべきであることを示します。

一方、"inline" に一致する場合 (大文字小文字を区別しない)、これはデフォルト処理を意味します。したがって、処置タイプ "inline" は、ファイル名 (Filename) などの追加パラメータ (下記参照) で拡張された場合にのみ有用です。

未知または未処理の処置タイプは、受信者によって "attachment" と同じ方法で処理されるべきです (SHOULD) ([RFC2183]のセクション2.8も参照)。

4.3. 処置パラメータ: ファイル名 (Disposition Parameter: 'Filename')

パラメータ (Parameter) "filename" と "filename*" (大文字小文字を区別せずにマッチング) は、メッセージペイロード (Message Payload) を保存するためのファイル名を構築する方法に関する情報を提供します。

処置タイプに応じて、この情報は直ちに使用される場合 ("attachment" 処置タイプによって引き起こされる "名前を付けて保存..." インタラクション) と、後で使用される場合 (例えば、ユーザーが現在表示されているページの内容を保存することを決定したとき) があります。

パラメータ "filename" と "filename*" の違いは、"filename*" が[RFC5987]で定義されたエンコーディング (Encoding) を使用し、ISO-8859-1文字セット (Character Set) ([ISO-8859-1]) に存在しない文字の使用を可能にする点のみです。

本仕様に先行する多くのユーザーエージェント (User Agent) 実装は "filename*" パラメータを理解しません。したがって、単一のヘッダーフィールド値に "filename" と "filename*" の両方が存在する場合、受信者は "filename*" を選択し、"filename" を無視すべきです (SHOULD)。これにより、送信者は、より表現力豊かな "filename*" パラメータと、レガシー受信者のフォールバック (Fallback) としての "filename" パラメータの両方を送信することで、特定のユーザーエージェントの特別なケース処理を回避できます (例についてはセクション5を参照)。

受信者は指定されたファイル名を助言としてのみ扱い、したがって望ましい情報を抽出する際に非常に注意深くあることが不可欠です。特に:

  • 受信者は、特別に権限を与えられた場所以外のいかなる場所にも書き込むことができてはなりません (MUST NOT)。問題を説明するために、よく知られたシステムの場所 ("/etc/passwd" など) を上書きできることの結果を考えてください。これを達成する一つの戦略は、filenameパラメータ内のフォルダ名情報を決して信頼しないことです。例えば、最後のパスセグメント (Path Segment) 以外のすべてを除去し、実際のファイル名のみを考慮します (ここで「パスセグメント」とは、パス区切り文字 (Path Separator Character) "\" と "/" によって区切られたフィールド値の構成要素です)。

  • 多くのプラットフォームは、ファイルシステム (File System) 内のタイプ情報を保持するためにインターネットメディアタイプ (Internet Media Type) ([RFC2046]) を使用せず、代わりにファイル拡張子 (Filename Extension) に依存しています。サーバーが提供するファイル拡張子を信頼すると、保存されたファイルが後で開かれたときに権限昇格 (Privilege Escalation) を招く可能性があります (".exe" を考慮してください)。したがって、メディアタイプを決定するためにファイル拡張子を使用する受信者は、使用されるファイル拡張子が安全であり、受信したペイロードのメディアタイプに最適に一致することを確認しなければなりません (MUST)。

  • 受信者は、ユーザーインターフェース (User Interface) とファイル名の両方で混乱を引き起こすことが知られている文字シーケンス (Character Sequence) を除去または置換すべきです (SHOULD)。例えば、制御文字 (Control Character) や、先頭および末尾の空白 (Whitespace) などです。

  • 受信者が注意する必要があるその他の側面は、ファイルシステムやシェルコマンド (Shell Command) で特別な意味を持つ名前です。例えば、"." と ".."、"~"、"|"、およびデバイス名 (Device Name) などです。受信者はこのような名前を無視または置換すべきです (SHOULD)。

注記: 多くのユーザーエージェントは、quoted-string形式を使用する際にエスケープ文字 (Escape Character) "\" を適切に処理しません。さらに、一部のユーザーエージェントは誤って "パーセント" エスケープ (Percent Escape) の非エスケープ処理を試みるため (附録C.2を参照)、パーセント文字の後に2桁の16進数が続くファイル名を誤って解釈する可能性があります。

4.4. 処置パラメータ: 拡張 (Disposition Parameter: Extensions)

将来の拡張を可能にするために、受信者は認識できないパラメータを無視すべきです (SHOULD) ([RFC2183]のセクション2.8も参照)。

4.5. 拡張性 (Extensibility)

[RFC2183]のセクション9は、処置値 (Disposition Value) と処置パラメータ (Disposition Parameter) の両方についてIANAレジストリ (IANA Registry) を定義していることに注意してください。このレジストリは、MIMEやHTTPなど、Content-Dispositionを使用する異なるプロトコル (Protocol) によって共有されています。したがって、すべての登録値がHTTPのコンテキストで意味を成すわけではありません。