| インターネット技術標準化委員会 (IETF) | J. Reschke |
| Request for Comments: 6266 | greenbytes |
| Updates: 2616 | 2011年6月 |
| カテゴリ: 標準化トラック | |
| ISSN: 2070-1721 |
ハイパーテキスト転送プロトコル (HTTP) における Content-Disposition ヘッダーフィールド の使用
概要
RFC 2616 は Content-Disposition 応答ヘッダーフィールドを定義していますが、それが HTTP/1.1 標準の一部ではないことを指摘しています。本仕様は HTTP で使用される Content-Disposition の定義と登録を引き継ぎ、国際化の側面を明確にします。
このメモのステータス
これはインターネット標準化トラック文書です。
本書はインターネット技術標準化委員会(IETF)の成果物です。本書は IETF コミュニティの合意を表しています。公開のために一般レビューを経て、インターネット技術運営指導グループ(IESG)によって承認されています。インターネット標準に関する詳細は RFC 5741 のセクション2 を参照してください。
本書の現在のステータス、正誤情報、およびフィードバックの提供方法についての情報は http://www.rfc-editor.org/info/rfc6266 で入手できます。
Copyright Notice
Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
1. はじめに
RFC 2616 は Content-Disposition 応答ヘッダーフィールド(RFC2616 の Section 19.5.1)を定義していますが、それが HTTP/1.1 標準の一部ではないと指摘しています(Section 15.5)。
Content-Disposition は HTTP 標準の一部ではありませんが、広く実装されているため、その利用法と実装者向けのリスクを文書化しています。
本仕様は、HTTP で使用される Content-Disposition の定義と登録を引き継ぎます。既存のユーザーエージェントでの相互運用性テストに基づき、MIME 版 ([RFC2183]) の機能のプロファイルを完全に定義し、国際化の側面も明確にします。
2. 記法上の規約
本書中のキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、および "OPTIONAL" は [RFC2119] に従って解釈されます。
本仕様は、拡張 BNF (ABNF) 表記を RFC 2616 の Section 2.1 で定義されたものに従って使用します。暗黙の線形空白 (LWS) に関する規則も含まれます。
3. 適合性とエラー処理
本仕様は、Content-Disposition ヘッダーフィールドの送信者(通常は HTTP オリジンサーバ)と受信者(通常は HTTP ユーザーエージェント)の両者に対する適合基準を定義します。実装が自身の役割に関連するすべての要件に準拠している場合、その実装は適合していると見なされます。
また、本仕様はヘッダーフィールド値のある形式を無効と定義します(ABNF と本文の要件の両方を使用して)(Section 4 参照)。ただし、これらの無効なフィールド値に対する特別な処理を定義するものではありません。
送信者は無効な Content-Disposition ヘッダーフィールドを生成してはなりません MUST NOT。
受信者は無効なヘッダーフィールドから利用可能なフィールド値を復元するための処置を採ることができます MAY。ただし、メッセージ自体を完全に却下すべきではありません(バリデータのように明示的にそうすることが望ましい場合を除く)SHOULD NOT。したがって、無効なフィールドの既定の扱いはそれらを無視することです。
4. ヘッダーフィールドの定義
Content-Disposition 応答ヘッダーフィールドは、応答ペイロードの処理方法について追加情報を伝えるために使用され、また、ローカルに応答ペイロードを保存する際に使用するファイル名などの追加メタデータを付与するためにも使用できます。
4.1. 文法
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 = <the characters in token, followed by "*">
以下は [RFC2616] で定義されています:
token = <token, defined in [RFC2616], Section 2.2> quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> value = <value, defined in [RFC2616], Section 3.6> ; token | quoted-string
以下は [RFC5987] で定義されています:
ext-value = <ext-value, defined in [RFC5987], Section 3.2>
同一のパラメータ名が複数回現れる Content-Disposition ヘッダーフィールド値は無効です。
また、暗黙の線形空白の規則(RFC2616 Section 2.1)により、単語(token または quoted-string)と区切り文字の間に任意の空白が現れてもよいことに注意してください。
さらに、ext-value で使用される形式は自然言語(例えば "en")を指定することを許しますが、これはファイル名に対しては限定的な有用性があり、受信者によって無視される可能性が高いことに注意してください。
4.2. ディスポジションの種類
ディスポジションの種類が "attachment"(大文字小文字を区別しない)に一致する場合、受信者は通常の処理(メディアタイプに従う処理)ではなく、ユーザーにローカルに保存するよう促すべきであることを示します。
一方、"inline" に一致する場合は既定の処理を意味します。従って、"inline" はファイル名などの追加パラメータで拡張される場合にのみ有用です。
不明または未処理のディスポジション種類は、受信者が "attachment" と同様に扱うべきです SHOULD(関連: [RFC2183] Section 2.8)。
4.3. ディスポジションパラメータ: 'Filename'
"filename" および "filename*" パラメータ(大文字小文字を区別しない一致)は、メッセージペイロードを保存する際に使用するファイル名を構築する方法に関する情報を提供します。
ディスポジションの種類に応じて、この情報は直ちに使用される場合があります("attachment" による "名前を付けて保存" 対話の際など)、または後で使用される場合があります(例えば、ユーザーが現在表示中のページの内容を保存することを決めたときなど)。
"filename" と "filename*" の違いは、"filename*" が [RFC5987] で定義されたエンコーディングを使用し、ISO-8859-1 に含まれない文字を利用できる点です。
多くの既存 UA は本仕様より前に実装されており "filename*" を理解しません。したがって、単一のヘッダーフィールド値に "filename" と "filename*" の両方が含まれている場合、受信者は "filename*" を選び "filename" を無視することを SHOULD 推奨します。これにより、送信者はより表現力のある "filename*" と、レガシー受信者向けのフォールバックとしての "filename" を同時に送ることができます(例は Section 5 を参照)。
受信者は指定されたファイル名を助言的なものとして扱うべきであり、抽出する際には非常に注意を払う必要があります。特に:
-
受信者はファイルシステム上で明示的に許可された場所以外に書き込みができないようにしなければなりません MUST NOT。例えば "/etc/passwd" のような既知のシステム領域を上書きできないようにする必要があります。一つの戦略は、filename パラメータのフォルダ名情報を信用せず、最後のパスセグメントのみを取り出して実際のファイル名だけを考慮することです('パスセグメント' は "\" や "/" による区切りで定義されます)。
-
多くのプラットフォームはファイルシステムでの型情報をインターネットメディアタイプではなくファイル拡張子に依存しています。サーバー提供の拡張子をそのまま信用すると、保存後にファイルを開く際に特権昇格を招く可能性があります(例: ".exe")。したがって、拡張子でメディアタイプを決める受信者は、受信したペイロードのメディアタイプに最適に一致する安全な拡張子を使用するようにする必要があります MUST。
-
受信者はユーザーインターフェースやファイル名で混乱を引き起こす既知の文字列(制御文字や先頭・末尾の空白など)を除去または置換することを SHOULD 推奨します。
-
ファイルシステムやシェルコマンドで特別な意味を持つ名前("."、".."、"~"、"|"、デバイス名など)についても注意が必要です。受信者はそのような名前を無視または置換することを SHOULD 推奨します。
4.4. ディスポジションパラメータ: 拡張
将来の拡張を可能にするため、受信者は未認識のパラメータを無視することを SHOULD 推奨します(関連: [RFC2183] Section 2.8)。
4.5. 拡張性
RFC2183 Section 9 は、ディスポジション種類とディスポジションパラメータのための IANA レジストリを定義していることに注意してください。このレジストリは MIME や HTTP のように Content-Disposition を使用する複数のプロトコルで共有されます。したがって、登録されたすべての値が HTTP の文脈で意味を持つとは限りません。
5. 例
ユーザーエージェントに「名前を付けて保存」ダイアログを表示させ、ファイル名を "example.html" に指定する例:
Content-Disposition: Attachment; filename=example.html
Content-Disposition ヘッダーフィールドが存在しないかのように振る舞わせつつ、後での保存操作のためにファイル名 "an example.html" を記憶させる例:
Content-Disposition: INLINE; FILENAME= "an example.html"
注: 空白を含められるように quoted-string 形式を使用しています。
ファイル名に Unicode 文字 U+20AC(ユーロ記号)を含めたうえで「名前を付けて保存」ダイアログを表示させる例:
Content-Disposition: attachment;
filename*= UTF-8''%e2%82%ac%20rates
ここでは、[RFC5987] で定義されたエンコーディングが非 ISO-8859-1 文字をエンコードするために使用されています。
上の例と同じですが、RFC 5987 を実装していない UA との互換性のために "filename" パラメータも追加した例:
Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates
注: RFC 5987 エンコーディングをサポートしない UA は、"filename*" が "filename" の後に出現する場合 "filename*" を無視します。
6. 国際化に関する考慮事項
"filename*" パラメータ(Section 4.3)は、[RFC5987] で定義されたエンコーディングを使用し、ISO-8859-1 文字セット外の文字をサーバーが送信できるようにし、任意で使用言語を指定することも可能にします。
将来のパラメータも国際化を必要とする可能性があり、その場合は同じエンコーディングが使用できます。
7. セキュリティに関する考慮事項
サーバー提供の情報を用いてローカルのファイル名を構築することは多くのリスクを導入します。これらは Section 4.3 に要約されています。
さらに、実装者は HTTP に適用されるセキュリティに関する考慮事項(RFC2616 Section 15)や、パラメータエンコーディングとして定義された [RFC5987] の考慮事項にも注意を払うべきです(RFC5987 Section 5 を参照)。
8. IANA に関する考慮事項
8.1. ディスポジション値およびパラメータのレジストリ
本仕様は、RFC2183 Section 9 で定義されたディスポジション値およびパラメータの登録手順に変更を導入しません。
8.2. ヘッダーフィールドの登録
本文書は恒久的な HTTP ヘッダーフィールドレジストリ([RFC3864] 参照)における Content-Disposition HTTP ヘッダーフィールドの定義を更新します。
- Header field name:
- Content-Disposition
- Applicable protocol:
- http
- Status:
- standard
- Author/Change controller:
- IETF
- Specification document:
- this specification (Section 4)
- Related information:
- none
9. 謝辞
Adam Barth、Rolf Eike Beer、Stewart Bryant、Bjoern Hoehrmann、Alfred Hoenes、Roar Lauritzsen、Alexey Melnikov、Henrik Nordstrom、Mark Nottingham に対し、有益なフィードバックを提供してくれたことに感謝します。
10. 参考文献
10.1. 規範的参考文献
- [ISO-8859-1]
- International Organization for Standardization, “Information technology -- 8-bit single-byte coded graphic character sets -- Part 1: Latin alphabet No. 1”, ISO/IEC 8859-1:1998, 1998.
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
- [RFC2616]
- Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “Hypertext Transfer Protocol -- HTTP/1.1”, RFC 2616, June 1999.
- [RFC5987]
- Reschke, J., “Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters”, RFC 5987, August 2010.
10.2. 参考情報
- [RFC2046]
- Freed, N. and N. Borenstein, “Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types”, RFC 2046, November 1996.
- [RFC2047]
- Moore, K., “MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text”, RFC 2047, November 1996.
- [RFC2183]
- Troost, R., Dorner, S., and K. Moore, Ed., “Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field”, RFC 2183, August 1997.
- [RFC2231]
- Freed, N. and K. Moore, “MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations”, RFC 2231, November 1997.
- [RFC2388]
- Masinter, L., “Returning Values from Forms: multipart/form-data”, RFC 2388, August 1998.
- [RFC3864]
- Klyne, G., Nottingham, M., and J. Mogul, “Registration Procedures for Message Header Fields”, RFC 3864, September 2004.
- [RFC3986]
- Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax”, RFC 3986, January 2005.
- [US-ASCII]
- American National Standards Institute, “Coded Character Set -- 7-bit American Standard Code for Information Interchange”, ANSI X3.4, 1986.
Appendix A. RFC 2616 定義からの変更
RFC 2616 の Section 19.5.1 と比較して、実際の実装を反映する以下の規範的変更が行われています:
- RFC 2616 によれば、ディスポジション種類 "attachment" は "application/octet-stream" タイプのコンテンツにのみ適用されるとされていました。この制限は削除されました。実際の受信者はコンテンツタイプをチェックしないことが多く、かつ適切にメディアタイプを宣言することを妨げるためです。
- RFC 2616 は filename パラメータに対して quoted-string のみを許可していましたが、これは例外的な構文であり、現実の利用を反映していませんでした。
- ディスポジション種類 "inline" の定義(RFC2183 Section 2.1)は再度追加され、その処理に関する提案が含まれています。
- 本仕様は [RFC5987] で定義された拡張パラメータエンコーディングのサポートを要求します。
Appendix B. RFC 2183 と比較した差分
RFC2183 Section 2 は "creation-date"、"modification-date"、"quoted-date-time"、"size" といった追加のディスポジションパラメータを定義しています。これらの多くはほとんどのユーザーエージェントで実装されていないため、本仕様では省略されています。
Appendix C. 国際化への代替アプローチ
デフォルトでは、HTTP ヘッダーフィールドパラメータは ISO-8859-1([ISO-8859-1])以外の文字を運べません(RFC2616 Section 2.2 を参照)。"filename" パラメータにとってこれは当然ながら受け入れられない制限です。
残念ながら、UA 実装者は相互運用可能なアプローチを作り出せていません。IETF Standards Track は一つの解決策(RFC2231、HTTP 用に RFC5987 で明確化)を指定していますが、実装者の間で一貫した採用が進んでいません。
完全性のために、以下では試みられた各アプローチを説明し、なぜ本仕様で用いられる RFC 5987 エンコーディングがそれらより優れているかを示します。
C.1. RFC 2047 エンコーディング
RFC 2047 はヘッダーフィールドのためのエンコーディング機構を定義していますが、このエンコーディングはヘッダーフィールドパラメータに使用することを想定していません(RFC2047 Section 5 を参照)。
'encoded-word' は 'quoted-string' 内に現れてはなりません。
...
'encoded-word' は MIME Content-Type や Content-Disposition のパラメータ、または構造化フィールド本文では 'comment' や 'phrase' 以外の場所で使ってはならない。
実際には、一部の UA はこのエンコーディングを実装し、一部は実装せず(エンコード文字列をユーザーに露呈)、一部は混乱します。
C.2. パーセントエンコーディング
一部の UA はパーセントエンコーディング(RFC3986 Section 2.1)を受け入れます。デコードに使われる文字エンコーディングは、参照ページのエンコーディング、UA のロケール、設定、パラメータ値など複数の要因に依存します。
実際には、これをサポートしない UA はエスケープされた文字列をそのまま表示し、サポートする UA でも期待される文字エンコーディングが予測困難なため、使いにくい手法です。
C.3. エンコーディングのスニッフィング
一部の UA は値(quoted-string 形式のデフォルトは ISO-8859-1)を検査し、UTF-8 の方が正しいと判断される場合に UTF-8 に切り替えます。
上記のアプローチと同様に、相互運用性がなく、実際の値を誤解釈するリスクがあります。
Appendix D. Content-Disposition ヘッダーフィールド生成に関する助言
既存および将来のユーザーエージェントとの相互運用を成功させるために、Content-Disposition ヘッダーフィールドの送信者は次の点に留意することが勧められます:
- US-ASCII([US-ASCII])で十分に表現できる場合は "filename" パラメータを含めること。
- filename パラメータに許されない文字(例: 空白)が含まれない場合は 'token' 形式を使用し、含まれる場合は quoted-string 形式を使用すること。
- 一部の実装はパーセント文字に続く 2 桁の 16 進をエスケープとみなすため、"%A9" のようなパーセント表現を filename に含めるのは避けること。
- quoted-string 形式の filename に "\" を含めるのは避けること。エスケープ処理が実装されていない UA があり、"\" が不正なパス文字と見なされることがあるため。
- filename に非 ASCII 文字を使用するのは避けること。多くの既存実装はそれらを ISO-8859-1 としてデコードしますが、いくつかは UTF-8 を検出するヒューリスティクスを適用するため、特定の名前で失敗する可能性があります。
- 要求されるファイル名を "filename" 形式で正確に表現できない場合は "filename*" パラメータを含めること。レガシー UA はこれを処理しないため、フォールバックとして "filename" を併用する必要があります。
- "filename*" を送る場合は、可能であればレガシー UA 用のフォールバックとして "filename" も生成すること(例: U+00E4 を "ae" に置換する等)。ロケールによっては不可能な場合があります。
- フォールバックの "filename" を含める場合、既存実装の解析問題のため "filename" を先に出現させることが望ましい。
- "filename*" パラメータが存在する場合は UTF-8 をエンコーディングとして使用すること。少なくとも一つの実装がそれのみを実装しているためです。
この助言は執筆時点での UA 挙動に基づくものであり、将来変更される可能性があります。公開時点で、<http://purl.org/NET/http/content-disposition-tests> が様々な実装でのサポート状況の概要を提供しています。