RFC2397 "data" URL スキームの翻訳
http://www.ietf.org/rfc/rfc2397.txt
自分の勉強用。http://userscripts.org/scripts/show/12781やhttp://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"をつけない場合には、データ(オクテット列)は次のように表される。
<メディアタイプ>を省略した場合には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の埋め込みデータに関する提案の一部として発表された。要求にもとづいて、さまざまな変更があった。
その変更点とは、
- メディアタイプが省略できるようになったこと
- base64エンコーディングの表記をもっと引き締めたこと
- エンコーディングとしての"quoted printable"を削除したこと(有効なURLをつくるのに、%xxエンコーディングを追加する必要があり、%xxエンコーディングだけあればそれで十分だった。)
data:スキームはVRMLや、新しいHTMLアプリケーションや、いろいろな商業製品に使われている。JavaやActiveXのアプリケーションでもオブジェクトのパラメータに使われている。
6. セキュリティ
"data" URLの中に埋め込まれたデータを解釈するときには、そのメディアタイプのどんな実装とも同じぐらい、セキュリティに考慮するべき。アプリケーションのコンフィグで処理してはならないとされているなら、そのメディアタイプのdata URLの内容は解釈すべきではない。
ファイアウォール・プロクシを用いてある種類のメディア・タイプ(たとえば、セキュリティに問題があるのがわかっているスクリプト言語やメディア・タイプ)を検索するのを禁止しているサイトでも、"data" URLスキームを使って該当するメディア・タイプがインクルードされてしまえば、それを遮断するのは難しいだろう。だけど、そのような脅威を意識すべきだし、そのドメイン内で必要だ思われるすべての予防策を講じておくべきだよ。
長い"data" URLを使用することで出る影響は今のところわからない。あるソフトウェア・パッケージでは、割り当てられたバッファサイズを超えたデータに出会ったときに、不適切なふるまいをするかもしれない。
7. 参考
*1:訳注:LITLEN,ATTSPLEN,TAGLENなどSGMLについてはマニアックな文法論議 - SGML宣言の読み方がわかりやすい
*2:訳注: 原文"helper"、よくわかってないのであとで考える
*3:訳注: 読み飛ばしてOK。