[53] データの[[バイト列]]を検査してその[[MIME型]]などを決定することを、[DFN[[[sniffing]]]] といいます。
[54] [DFN[[[MIME Sniffing]]]] 仕様書が [[Web]] における [[sniffing]] について規定しています。
* 仕様書
[REFS[
- [32] [CITE[MIME Sniffing]] ([TIME[2011-11-27 08:05:14 +09:00]] 版)
]REFS]
* Sniffing が行われる場面
[61] [[sniffing]] は次の場面で行われます。
[FIG[
- [[MIME type sniffing algorithm]]
-- [[navigate]]
-- [CODE(HTMLe)@en[[[object]]]]
- [[rules for distinguishing if a resource is text or binary]]
-- [CODE(HTMLe)@en[[[object]]]]
- [[rules for sniffing images specifically]]
-- [CODE(HTMLe)@en[[[link]]]] が[[画像]]を指す場合
-- [CODE(HTMLe)@en[[[img]]]]
-- [CODE(HTMLe)@en[[[object]]]]
-- [CODE(HTML)@en[[[]]]]
-- [CODE(DOMm)@en[[[createImageBitmap]]]] で [CODE(DOMi)@en[[[Blob]]]] の場合
]FIG]
* その他の sniffing
** JSON Sniffing
[25] [[RFC 4627]] が [[JSON]] の [[charset]] [[sniffing]] について言及しています。
** RDFa 処理器の Sniffing
[50] [[RDFa 1.1]] に基づく [[RDFa処理器]]は、 [[MIME型]]によって[[ホスト言語]]を決定しなければ[['''なりません''']]。
[[MIME型]]を決定できないか未対応の時は、 [CODE(MIME)@en[[[application/xml]]]] としなければ[['''なりません''']]。
[SRC[>>49]]
[51] >>50 の直後にこれと矛盾する次のような「NOTE」があります。 [[MIME型]]が無い時、
[[DOCTYPE]]、[[根要素]]、[[拡張子]]、[[利用者]]定義の引数など追加の仕組みを用いても[['''構いません''']] [SRC[>>49]]。
[REFS[
- [49] [CITE@en[RDFa Core 1.1 - Second Edition]] ([TIME[2013-08-15 17:12:47 +09:00]] 版)
]REFS]
* 歴史
[55] [[IE]] は古くから [CODE(HTTP)@en[[[Content-Type:]]]] ヘッダーを一部無視して[[拡張子]]を使ったり
[[sniffing]] したりしており、それによって他の [[Webブラウザー]]と異なる解釈をしたり、
それによって (本来の仕様上は問題ないはずのもので) [[セキュリティー]]上の問題を引き起こしたりして非難されていました。
しかし間違った [CODE(HTTP)@en[[[Content-Type:]]]] を送出する[[起源鯖]]も広く存在しており、
また他のブラウザーも [CODE(HTMLe)@en[[[script]]]] の [CODE(HTTP)@en[[[Content-Type:]]]]
を無視したり、 [CODE(HTMLe)@en[[[img]]]] では [[sniffing]] を行ったりしていて、
[[sniffing]] を排除することは最早できない状況でした。
[56] そうはいっても各 [[Webブラウザー]]が独自に異なる [[sniffing]] を行って標準仕様が存在しない状況では、
サーバー側で[[セキュリティー]]上の問題を回避するための十分な対策を施すのも困難 (何をもって十分としてよいかすらわからない状態)
でありました。
[57] 2007年頃になってようやく [[Ian Hickson]] によって [[WHATWG]] [[Web Applications 1.0]] (後の [[HTML5]]、
現在の [[HTML Standard]]) で [[Webブラウザー]]が実装するべき [[sniffing]] の規則が正確かつ詳細に規定されるようになりました。
[58] その後 [[IETF]] と [[W3C]] の圧力によって [[sniffing]] は [[HTML5]] 仕様書から切り離され、
この分野の専門家である [[Adam Barth]] による [[Internet Draft]] として [[IETF]] で出版されるようになりました。
[59] しかしその作業も停滞していたことから 2012年、 [[Gordon P. Hemsley]] が引き取って再び [[WHATWG]]
で [[Living Standard]] として出版されるようになりました。
;; [60] 同じような経緯で [[W3C]] に行った仕様書はその後 [[WHATWG]] で作業が再開された後 [[W3C]]
が劣化コピーを発行し続ける例が多いですが、 [[IETF]] はそういうことはしていません。
* メモ
[1]
[CITE[葉っぱ日記 - 「拡張子ではなく、内容によってファイルを開くこと」の拡張子は Content-Type ではないことに注意]] ([CODE[2007-04-04 15:46:35 +09:00]] 版)
([[名無しさん]] [WEAK[2007-04-04 23:46:23 +00:00]])
[2]
[CITE@en[Re: Proposed Design Principles updated]] ([[Ian Hickson]] 著, [CODE[2007-04-05 14:51:37 +09:00]] 版)
> One browser started ignoring CSS files in one very specific
case, namely only if the document had a DOCTYPE that, at the time, was
basically unused. (I was one of the two people pushing for this.) It broke
some sites, but comparatively few in the grand scheme of things. (Though
we still get bug reports about this today, so maybe it wasn't that good an
idea after all.)
([[名無しさん]])
[3]
[CITE[Mime sniffing data]] ([[Adam Barth ]] 著, [TIME[2008-10-09 01:34:49 +09:00]] 版)
[4] [CITE[Content-Type Processing Model ]] ([TIME[2009-01-10 07:14:52 +09:00]] 版)
[5] [CITE@en[Sam Ruby: Mime Sniff]] ([TIME[2009-01-12 10:24:59 +09:00]] 版)
[6] [CITE[IRC logs: freenode / #whatwg / 20090927]]
([TIME[2009-11-30 23:26:32 +09:00]] 版)
[7] [CITE[IRC logs: freenode / #whatwg / 20090927]]
([TIME[2009-11-30 23:26:32 +09:00]] 版)
[8] [CITE[IRC logs: freenode / #whatwg / 20090929]]
([TIME[2009-12-02 08:29:55 +09:00]] 版)
[9] [CITE[Bug 8479 – http content-type override mandatory for