メインコンテンツまでスキップ

7.5.2. 意味的に等価なフィールド値 (Semantically Equivalent Field Values)

7.5.2. 意味的に等価なフィールド値 (Semantically Equivalent Field Values)

署名ベース生成アルゴリズム (Section 2.5) は, HTTP フィールドの値をコンポーネント値として用いる. 通常は, 署名者と検証者の双方でフィールド値の実際のバイト列をコンポーネント値として取ることになる. しかし, 一部のフィールド値では, 値そのものに用いるバイト列を変えるが意味的には等価な変換が許される. たとえば, フィールド定義は値の一部または全部を大文字小文字を区別しないと宣言したり, 内部の空白文字に特別な扱いを与えたりできる. 他のフィールドでは中継者による変換が想定される, たとえば Via ヘッダフィールドにおけるコメントの除去などである. そのような場合, 検証者は等価に変換されたフィールド値を用いることでつまずき, 署名者が用いたバイト列と異なる値になってしまう. 検証者はこの種の誤りを見つけるのが難しい. フィールドの値はアプリケーションとしては受け入れ可能でも, 署名ベースが要求する実際のバイト列とは一致しないからである.

そのようなフィールドを処理するとき, 署名者と検証者は, そのような変換をどう扱うか (あるいは扱わないか) で一致していなければならない. 選択肢のひとつは問題のあるフィールドに署名しないことだが, アプリケーションに対して十分な署名カバレッジ (Section 7.2.1) が残るよう注意が必要である. もうひとつの選択肢は, HTTP メッセージに追加する前にフィールドに対するアプリケーション固有の正規化値を定義することである. たとえば署名前に常に内部コメントを除去する, または値を常に小文字に変換するなどである. これらの変換はフィールドが署名ベース生成アルゴリズムへの入力として用いられる前に適用されるため, 署名ベースには依然としてメッセージ内に現れるフィールドのバイト列値がそのまま含まれる. 変換をメッセージから値を取り出した後に署名ベースへ加える前に適用すると, 値置換攻撃など異なる攻撃面がアプリケーションに対して開く. すべてのアプリケーション固有の追加規則は本仕様の範囲外であり, 性質上, その特定のアプリケーション以外での実装の相互運用性を損なう. アプリケーションは, 可能な限りそのような追加規則の使用を避けることが推奨される.