[53] [[データ]]を構成する[[バイト列]]を検査してその内容の種別などを決定することを
[DFN[sniffing]] といいます。

* 型を検知する

** MIME sniffing (Web)

[1] [[Web]] では、 [[MIME sniffing]] によって [[MIME型]]が決定されます。

;; [[MIME sniffing]] 参照。

** [CODE[file(1)]]

[5] [CODE[file(1)]] 参照。

** MIME magic

[97] 多くの[[プラットフォーム]]に [[MIME magic]] などと称するツールがあります。
これは、[[ファイル]]の先頭の[[バイト]]列から [[MIME型]]を推定するものです。

;; [[MIME magic]] 参照。



** 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]] 版) <http://www.w3.org/TR/rdfa-core/#h3_processorconf>
]REFS]

** IPP の Sniffing

[FIG(quote)[
[FIGCAPTION[
[82] [CITE@en[RFC 2911 - Internet Printing Protocol/1.1: Model and Semantics]]
([TIME[2015-02-15 17:22:27 +09:00]] 版)
<https://tools.ietf.org/html/rfc2911#section-4.1.9.1>
]FIGCAPTION]

> One special type is 'application/octet-stream'.  If the Printer
object supports this value, the Printer object MUST be capable of
auto-sensing the format of the document data using an
implementation-dependent method that examines some number of octets
of the document data, either as part of the create operation and/or
at document processing time.

]FIG]

** メモ

[24] 
[CITE[Word で「打」で始まるテキスト ファイルを開くとコンバーターを要求される | Japan Office Client Support Blog]], [TIME[2024-09-17T04:45:18.000Z]], [TIME[2024-09-18T02:25:46.578Z]] <https://officesupportjp.github.io/blog/cm15ufuis0000f0seec0i7yev/>


[23] 
[CITE@en[[[compact_enc_det]]/compact_enc_det/compact_enc_det.cc at master · google/compact_enc_det · GitHub]], [TIME[2025-11-24T07:42:54.000Z]] <https://github.com/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L2288>


[26] >>23 [CITE[ced]] は[[文字コードの判定]]のライブラリーですが、
[[文字列]]ではなく[[バイナリー]]であるとの判定をすることもあり、
主要な[[ファイル形式]]の先頭バイトパターンを知っています。

* 文字符号化を検知する

[10] 
[[テキストファイル]]の[[文字コードの判定]]の処理が必要になることがしばしばあります。
いくつかの[[テキストファイル]]系[[ファイル形式]]はその手法を定めています。

[11] 
この処理は[[ファイル形式]]の判定と同時に実装されることもあれば、
別個に実装されることもあります。

[12] 
全般については[[文字コードの判定]]を参照。


[13] 
[[ファイル形式]]中立の記述法については >>3 を参照。

** 符号化 sniffing (Web)

[SEE[ [[encoding sniffing algorithm]] ]]


** その他のファイル形式の sniffing

[25] [[RFC 4627]] が [[JSON]] の [[charset sniffing]] について言及しています。
[SEE[ [[JSON]] ]]

[35] [[SRGS]] の [[ABNF形]]が [[XML]] と同等の [[sniffing]]
を求めています。
[SEE[ [CODE[#ABNF]] ]]



* 特別な記述を検出する手法

[FIG(list short)[ [3] [[テキストファイル]]の内なる[[メタ情報]]
- [[shebang]]
- [[魔法行]]
- [[ファイル変数]]
-- [CODE[-*-]]
-- [CODE[-*- coding -*-]]
- [CODE[vim:]]
- [CODE[SPDX-License-Identifier:]]
- [CN[BOM]]
- [[「魔法」注釈]]
- [CODE[#VRML]]
- [CODE[#X3D]]
- [CODE[#ABNF]]

]FIG]

[SEE[ [[テキストファイル]], [[テキストファイルの先頭]], [[コメントの中身が意味を持ってしまう]] ]]


* sniffing の対象となる範囲

[SEE[ [[資源ヘッダー]] ]]


* 相互運用性

[14] 
[[sniffing]] は[[発見的]]方法によることが多く、[[相互運用性]]に乏しいのが問題です。

[15] 
[[Webプラットフォーム]]は [[sniffing]] の方法も[[標準化]]していますが、 
各実装は完全にそれに従っているわけではなく、
[[相互運用性]]の問題は皆無ではありません。

* セキュリティー

[16] 
[[sniffing]] の[[相互運用性]]の問題は、そのまま[[セキュリティー]]の問題となります。

[17] 
とりわけ、安全と考えられている[[ファイル形式]]が危険な[[ファイル形式]]と(誤)判定され得る状況は、
しばしば悪用されます。

[18] 
故に、

- [19] 可能なら [[sniffing]] は避けること
- [20] [[sniffing]] が不可避なら、[[仕様書]]で明確に挙動を規定すること
- [22] [[sniffing]] 結果次第で安全性に違いが生じ得るときは、
その危険の程度を把握して当事者 (標準化の担当者、実装者および通信の当事者)
で認識を共有すること
- [21] 実装は[[仕様書]]が定めた挙動に厳密に従うこと

は[[セキュリティー]]のために極めて重要と考えられています。

-*-*-

[2] 
入力が短すぎるときの処置が正しくない実装がしばしばみられます。
所与のパターンとの比較時にパターンより短い入力を想定し忘れているような類です。
[[バッファーオーバーフロー]]など深刻な[[不具合]]となることもあり、
特に注意が必要です。

[4] 
入力が長すぎる場合にも注意が必要です。例えば数GBのファイルの全体を判定するため全体をメモリー上に載せるのは無駄であり、
適当なところで打ち切るのが妥当です。

[6] 
無限の入力を扱い得る[[プラットフォーム]]では、処理が終了しなくなることがないよう、
特に注意が必要です。

[7] 
[[行]]を単位とする処理が必要な場合にも[[行]]が長すぎる場合の考慮を忘れがちなので、
注意が必要です。

[EG[
[8] [[行]]を期待する処理に[[バイナリーデータ]]が入力されたとき、
当該[[バイナリーデータ]]には[[改行コード]]が含まれないかもしれません。
]EG]

[SEE[ [[資源ヘッダー]] ]]

-*-*-

[SEE[ [[文字のセキュリティー]] ]]


* 関連

[SEE[ [[ファイル形式]] ]]

[SEE[ [[文字としてのバイト]] ]]

[SEE[ [[テキストファイルの先頭]] ]]

** データの種別以外の sniffing

[SEE[ [[browser sniffing]] ]]

* メモ


[9] [CITE@en[rouge/lib/rouge/guessers at master · jneen/rouge]]
([TIME[2018-02-22 14:43:00 +09:00]])
<https://github.com/jneen/rouge/tree/master/lib/rouge/guessers>



