7.5.6. リストでないフィールド値 (Non-List Field Values)
7.5.6. リストでないフィールド値 (Non-List Field Values)
単一のメッセージ内で HTTP フィールドが複数回現れる場合, Section 2.5 に述べるとおり, これらの値は HTTP 署名ベースに含めるために単一の 1 行の文字列値へ結合する必要がある. すべての HTTP フィールドがこの方法で単一の値に結合でき, かつフィールドにとって有効な値のままであるとは限らない. 署名ベースを生成する目的では, メッセージコンポーネント値を署名ベース文字列から読み戻したりアプリケーションで用いたりすることは意図されていない. したがって, 署名ベース生成アルゴリズムを, 特にこの性質を持つことが知られているフィールドについてはアプリケーションによるフィールド値の処理から分離して扱うことが最善と考えられる. 署名しているフィールド値が検証に通らない場合, 署名付きメッセージも拒否すべきである.
HTTP フィールドが値の中に引用符で囲まれていないカンマを許す場合, 複数のフィールド値を結合すると, 意味的に異なる 2 つのメッセージが署名ベース上で同じ行を生じうる. たとえば, 内部にカンマを含む構文を持つ次の仮想的なヘッダフィールドで, 2 つの別々の値のリストを定義する:
Example-Header: value, with, lots Example-Header: of, commas
このヘッダフィールドでは, これらすべての値を単一のフィールド値として送ると, 単一の値のリストになる:
Example-Header: value, with, lots, of, commas
どちらのメッセージも署名ベースでは次の行を生む:
"example-header": value, with, lots, of, commas
意味的に異なる 2 つの入力が署名ベースで同じ出力になりうるため, そのような値を扱う際は特に注意が必要である.
具体的には, Set-Cookie フィールド [COOKIE] は [STRUCTURED-FIELDS] で提供される List 構文に適合しない内部構文を定義する. 特に一部では引用符のないカンマを許し, 複数のクッキーを送る際は通常, 異なる値を持つ複数の別々のフィールド行として送られる. 同一メッセージ内で複数の Set-Cookie フィールドが送られる場合, [HTTP] の Section 5.3 で論じるとおり, 一般にこれらを 1 行に結合して結果を構文解析し利用できるようにすることはできない. したがって, すべてのクッキーは結合せずに別々のフィールド値から処理する必要がある一方, 署名ベースはこの目的のためにのみ生成される特別な結合値から処理する必要がある. クッキー値が無効なら署名付きメッセージは拒否すべきである. Section 7.5.7 で述べるパディング攻撃の可能性があるからである.
これに対処するため, アプリケーションは Set-Cookie のような問題のあるフィールドへの署名を制限できる. たとえば単一のフィールド値のみが存在し結果があいまいでない場合にのみフィールドを署名に含めるなどである. 署名ベースへの非決定的な写像を持ちうるすべてのフィールドでも同様の注意が必要である. 署名者は Section 2.1.3 で述べるとおり bs パラメータを用いてそのようなフィールドを保護することもできる.