RFC2397 "data" URL スキームの翻訳

http://www.ietf.org/rfc/rfc2397.txt

自分の勉強用。http://userscripts.org/scripts/show/12781http://userscripts.org/scripts/show/9653で使われていて興味を持ったので。

読みやすさを優先して、表記を変えたり番号なしリストや定義リストにしてる箇所がある。原文参照。

他の訳を見つけた。でも硬すぎて読みにくい気がする。http://www.darts.jp/reference/rfc/rfc2397-jp.txt

1. 概要

新しいURLスキームである"data"を定義する。これを使うと、小さなデータを外部からインクルードしなくても、直接ソースコードに含めることができるよ。

2. 説明

URLを扱うアプリケーションは、種類によっては(サイズの小さい)メディアタイプのデータを直接内部に埋め込む必要がある。このドキュメントでは「即値アドレス指定(immediate addressing)」のように機能する新しいURLスキームを定義する。このURLの形式は以下のとおり。

data:[<メディアタイプ>][;base64],<データ>

<メディアタイプ>にはインターネット・メディアタイプを(オプションつきで)指定する。";base64"はデータがbase64エンコードされているということだ。";base64"をつけない場合には、データ(オクテット列)は次のように表される。

  • URLに使用できる文字の範囲内のオクテットにはASCIIエンコードを用いる。
  • 範囲外のオクテットには標準的な%xx形式の16進数エンコーディングを用いる。

<メディアタイプ>を省略した場合にはtext/plain;charset=US-ASCIIがデフォルトになる。
簡略した書き方として、文字セットが指定されている場合には"text/plain"は省略できる。

data:スキームは短い値にのみ有効だよ。アプリケーションによってはURLの長さを制限をしているものがある。たとえば、HTMLの<A>アンカーの中に埋め込まれたURLについては、HTMLを宣言したSGMLで長さが制限されている[RFC1866]

LITLEN (1024)
1つの属性値リテラルに含まれる文字数の制限
ATTSPLEN (2100)
1つのタグに指定された属性値すべてを合わせた文字数の制限
TAGLEN (2100)
タグ全体の長さの制限*1

dataスキームは相対URLで指定することはできない。

3. シンタックス

dataurl    := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype  := [ type "/" subtype ] *( ";" parameter )
data       := *urlchar
parameter  := attribute "=" value

"urlchar"はRFC2396、"type", "subtype", "attribute","value"はRFC2045にそれぞれ定義されており、RFC2396のURLエスケープを用いて表す必要がある。

RFC2045では、属性値(attribute value)をトークンとクオート付き文字列の両方で表すことが許されている。けれど、"data" URLの中ではクオート付き文字列で表すやり方は扱いづらい。なぜなら、クオートマーク自体が有効なurlcharではないからだ。こういう理由があるので、もしパラメーターの値が"tspecial"文字を含んでいる場合には、クオート付き文字列ではなくURLエスケープを使ったほうがいい。

";base64"はcontent-type parameterと区別することができる。というのは、";base64"のあとには"="記号が無いから。

4. 例

data URLはどんな種類のデータにも使用できる。

data:,A%20brief%20note

上記のURLはtext/plainな"A brief note"という文字列にエンコードされる。脚注リンクに便利かもしれない。

<IMG
SRC="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
hhx4dbgYKAAA7"
ALT="Larry">

上記のHTMLは、HTMLドキュメントの中で小さなインライン画像を表示するのに使用できる(上記の埋め込み画像がおそらく使用できる限度だろう。これ以上大きなデータには、data URLはふさわしくないと考えられる)。

データスキームのメディアタイプには他のパラメータを指定することもできる。たとえば、文字集合のパラメータを指定できる。

data:text/plain;charset=iso-8859-7,%be%fg%be

上記のURLは短いギリシャ文字の文字列をあらわすのに使用できる。

アプリケーションによっては、data:スキームを他のネットワーク・アプリケーションに設定パラメータ渡すために用いるかもしれない。たとえば以下のようなメディアタイプを作る。

application/vnd-xxx-query

content部分にくるのは、"xxx"というベンダーのデータベースに対する、クエリ文字列とデータベース識別子。

data:application/vnd-xxx-
query,select_vcount,fcol_from_fieldtable/local

上記のような形式のURLは、ローカルなアプリケーションで、application/vnd-xxx-queryの「ヘルパー」*2を立ち上げ、そのヘルパーに即値でデータを与えてやることができる。

5. 歴史*3

このアイデアはもともと1995年に提案された。data:スキームのいくつかのバージョンは、VRMLの定義に使用されているし、あるバージョンはHTMLの埋め込みデータに関する提案の一部として発表された。要求にもとづいて、さまざまな変更があった。
その変更点とは、

data:スキームはVRMLや、新しいHTMLアプリケーションや、いろいろな商業製品に使われている。JavaActiveXのアプリケーションでもオブジェクトのパラメータに使われている。

6. セキュリティ

"data" URLの中に埋め込まれたデータを解釈するときには、そのメディアタイプのどんな実装とも同じぐらい、セキュリティに考慮するべき。アプリケーションのコンフィグで処理してはならないとされているなら、そのメディアタイプのdata URLの内容は解釈すべきではない。

ファイアウォール・プロクシを用いてある種類のメディア・タイプ(たとえば、セキュリティに問題があるのがわかっているスクリプト言語やメディア・タイプ)を検索するのを禁止しているサイトでも、"data" URLスキームを使って該当するメディア・タイプがインクルードされてしまえば、それを遮断するのは難しいだろう。だけど、そのような脅威を意識すべきだし、そのドメイン内で必要だ思われるすべての予防策を講じておくべきだよ。

長い"data" URLを使用することで出る影響は今のところわからない。あるソフトウェア・パッケージでは、割り当てられたバッファサイズを超えたデータに出会ったときに、不適切なふるまいをするかもしれない。

7. 参考

  • [RFC2396] "Uniform Resource Identifiers (URI): Generic Syntax"
  • [RFC1866] "Hypertext Markup Language - 2.0."
  • [RFC2045] "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies"

*1:訳注:LITLEN,ATTSPLEN,TAGLENなどSGMLについてはマニアックな文法論議 - SGML宣言の読み方がわかりやすい

*2:訳注: 原文"helper"、よくわかってないのであとで考える

*3:訳注: 読み飛ばしてOK。