サブリソース完全性

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-sri-2-20260320/
最新公開バージョン:
https://www.w3.org/TR/sri-2/
編集者草案:
https://w3c.github.io/webappsec-subresource-integrity/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/sri-2/
フィードバック:
public-webappsec@w3.org に件名行「[sri] … メッセージのトピック …」を付けて送信(アーカイブ
GitHub
編集者:
Frederik Braun (Mozilla)
元編集者:
Devdatta Akhawe (Dropbox Inc.)
François Marier (Mozilla)
Joel Weinberger (Google Inc.)
テストスイート:
https://wpt.fyi/results/subresource-integrity/

要約

この仕様は、フェッチされたリソースが予期しない改変なしに配信されたことをユーザーエージェントが検証できる仕組みを定義する。

この文書の状態

この節は、公開時点におけるこの文書の状態を説明する。 現在の W3C 公開文書およびこの技術報告書の最新改訂版の一覧は、 W3C 技術報告書 索引で確認できる。

この文書は、 Web Application Security Working Group により、Recommendation track を用いた作業草案として公開された。この文書は W3C 勧告になることを意図している。

この仕様の議論には、(アーカイブ済みの)公開メーリングリスト public-webappsec@w3.org手順を参照) を利用することが推奨される。 電子メールを送信する際は、 件名に “sri” というテキストを含めること。 できれば次のようにする: “[sri] …コメントの要約…

作業草案としての公開は、 W3C およびその会員による承認を意味しない。これは草案文書であり、 いつでも他の文書によって更新、置換、または 廃止される可能性がある。この文書を進行中の作業以外として引用することは不適切である。

この文書は、 Web Application Security Working Group によって作成された。

この文書は、 W3C Patent Policy の下で活動するグループによって作成された。 W3C は、そのグループの成果物に関連して行われた すべての特許開示の公開リスト を保持している。 そのページには特許を開示するための手順も含まれている。 Essential Claim(s) を含むと個人が考える特許について実際の知識を持つ個人は、 W3C Patent Policy の第 6 節に従ってその情報を開示しなければならない。

この文書は、2025年8月18日 W3C Process Document によって管理される。

1. 序論

Web 上のサイトやアプリケーションが、単一のオリジンからのリソース だけで構成されることはまれである。たとえば、作者はスクリプトやスタイルを さまざまなサービスやコンテンツ配信ネットワークから取得し、配信された表現が 実際に読み込むことを期待したものであると信頼しなければならない。攻撃者が DNS [RFC1035] ポイズニング、またはその他のそのような手段によって、 敵対的なサーバーからコンテンツをダウンロードするようにユーザーをだませる場合、 作者に対抗手段はない。同様に、Content Delivery Network (CDN) サーバー上の ファイルを置き換えられる攻撃者は、任意のコンテンツを注入する能力を持つ。

安全なチャネル上でリソースを配信することで、このリスクの一部は軽減される: TLS [TLS]、HSTS [RFC6797]、およびピン留めされた公開鍵 [RFC7469] により、ユーザーエージェントは 自分が通信していると考えるサーバーと実際に通信していることをかなり確信できる。 しかし、これらの仕組みが認証するのはサーバーだけであり、コンテンツではない。 サーバーにアクセスできる攻撃者(または管理者)は、罰せられることなくコンテンツを操作できる。 理想的には、作者はサーバーの鍵だけでなくコンテンツもピン留めでき、 リソースの正確な表現、およびその表現だけが読み込まれて実行されることを 保証できるべきである。

この文書はそのような検証方式を規定し、作者が読み込むことを期待する リソースの表現の暗号学的ハッシュを含む integrity 属性で 2 つの HTML 要素を拡張する。たとえば、作者はあるフレームワークを自身の オリジンでホストするのではなく、共有サーバーから読み込みたい場合がある。 https://example.com/example-framework.js期待される SHA-384 ハッシュが Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7 であると指定することは、 ユーザーエージェントがその URL から読み込むデータが、その中に含まれる JavaScript を 実行する前に、その期待されるハッシュと一致することを検証できることを意味する。 この完全性検証により、攻撃者が悪意あるコンテンツを置き換えられるリスクが 大幅に低減される。

この例は、次のようにハッシュを script 要素に追加することでユーザーエージェントに伝えられる:

<script src="https://example.com/example-framework.js"
        integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"
        crossorigin="anonymous"></script>

もちろん、完全性検証の恩恵を受けるレスポンス型はスクリプトだけではない。 ここで規定する方式は link にも適用され、この仕様の将来の版では この適用範囲が拡大される可能性が高い。

テスト

1.1. 目標

  1. サードパーティサービスの侵害が、そのスクリプトを含むすべてのサイトの侵害を 自動的に意味してはならない。コンテンツ作者は、読み込むコンテンツに対する 期待を指定できる仕組みを持つことになる。つまり、たとえば特定の URL を たまたま持つ任意のスクリプトではなく、特定のスクリプトを 読み込めるということである。

  2. 検証機構には、不正なレスポンスを受信したことを作者に通知する エラー報告機能があるべきである。

1.2. ユースケース/例

1.2.1. リソース完全性

2. 主要な 概念と用語

この節では、文書全体で使用されるいくつかの用語を定義する。

ダイジェストという用語は、 任意のデータブロックに対して暗号学的ハッシュ関数を実行した結果を base64 符号化したものを指す。

オリジンおよび同一 オリジンという用語は HTML で定義される。[HTML]

base64 符号化RFC 4648 の第 4 節で定義される。 [RFC4648]

SHA-256SHA-384、および SHA-512 は、 NIST によって定義される SHA-2 暗号学的ハッシュ関数群の一部である。 [SHA2]

有効な SRI ハッシュアルゴリズムトークン集合は、順序集合 « "sha256", "sha384", "sha512" »(それぞれ SHA-256SHA-384、および SHA-512 に対応)である。この集合の順序には 意味があり、より強いアルゴリズムほど集合内で後に現れる。 追加情報については、 § 3.2.2 優先度および§ 3.3.3 set から最強の メタデータを取得するを参照。

文字列は、その ASCII 小文字化有効な SRI ハッシュアルゴリズムトークン集合含まれる場合、 有効な SRI ハッシュアルゴリズムトークンである。

2.1. 文法上の概念

この文書で使用される Augmented Backus-Naur Form (ABNF) 記法は、 RFC5234 で規定される。[ABNF]

付録 B.1 of [ABNF] は、VCHAR(表示 文字)および WSP (空白)規則を定義する。

Content Security Policy は、base64-value および hash-algorithm 規則を定義する。[CSP]

3. フレームワーク

ここで規定される完全性検証機構は、要するに、リソースに対して十分に強い 暗号学的ダイジェストを生成し、そのダイジェストをユーザーエージェントに 送信して、レスポンスの検証に使用できるようにするプロセスである。

3.1. 完全性メタデータ

レスポンスの完全性を検証するため、ユーザーエージェントは リクエストの一部として 完全性 メタデータを必要とする。この メタデータは、次の情報片から構成される:

レスポンスの完全性を検証するには、ハッシュ関数とダイジェストが 提供されなければならない。

注: 現時点では、オプションは定義されていない。しかし、 この仕様の将来の版では、MIME タイプ [MIME-TYPES] などの オプションが定義される可能性がある。

このメタデータは、Content Security Policy Level 2 仕様の第 4.2 節における hash-source(単一引用符なし)と 同じ形式で符号化されなければならない。

たとえば、alert('Hello, world.'); という文字列だけを含むスクリプトリソースが与えられた場合、 作者はハッシュ関数として SHA-384 を選択するかもしれない。 H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO は、その結果となる base64 符号化されたダイジェストである。これは 次のように符号化できる:

sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
ダイジェストは、任意の数のユーティリティを使って生成できる。たとえば OpenSSL は、かなり一般的に 利用可能である。この節の例は、次のコマンドラインの結果である:
echo -n "alert('Hello, world.');" | openssl dgst -sha384 -binary | openssl base64 -A

3.2. 暗号学的ハッシュ関数

適合するユーザーエージェントは、リクエストの 完全性 メタデータの一部として使用するために、 SHA-256SHA-384、 および SHA-512 暗号学的ハッシュ関数をサポートしなければならず、 この文書の将来の反復で定義される追加のハッシュ関数をサポートしてもよい。

注: この文書でサポートされるアルゴリズムは、 (現時点では!)第二原像攻撃および衝突攻撃に耐性があると考えられている。 サポート対象アルゴリズム集合への将来の追加/削除では、同様の標準を適用することが 強く推奨される。§ 5.2 ハッシュ衝突攻撃を参照。

3.2.1. 俊敏性

将来の暗号学的発見に対応する俊敏性を提供するため、単一のリソースに複数の 完全性メタデータ集合を関連付けてもよい。 たとえば、前節で説明したリソースは、次のいずれかのハッシュ式によって 記述されてもよい:

sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw==

作者は、たとえば両方を指定することを選択できる:

<script src="hello_world.js"
   integrity="sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
              sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw=="
   crossorigin="anonymous"></script>

この場合、ユーザーエージェントはリスト内で最も強いハッシュ関数を選択し、 そのメタデータを使用してレスポンスを検証する(下記の § 3.3.2 メタデータを構文解析するおよび§ 3.3.3 set から最強のメタデータを取得するアルゴリズムで説明する)。

ハッシュ関数が安全でないと判断された場合、ユーザーエージェントは、その安全でない ハッシュ関数を用いた完全性検証のサポートを非推奨にし、最終的に削除すべきである。 ユーザーエージェントは、非推奨の関数に基づくダイジェストを使用してレスポンスの 妥当性を確認してもよい。

作者が古いユーザーエージェントに足を引っ張られずに、より強いハッシュ関数へ 切り替えられるようにするため、サポートされていないハッシュ関数を用いた検証は、 完全性値が提供されなかったかのように振る舞う(下記の § 3.3.4 bytes は metadataList と一致するか?アルゴリズムを参照)。 作者は強いハッシュ関数を使用し、より強いハッシュ関数が利用可能になり次第、 それらへの移行を開始することが奨励される。

3.2.2. 優先度

ハッシュアルゴリズムの優先順位は、 有効な SRI ハッシュアルゴリズムトークン集合における それぞれのトークンの順序によって規定される。その集合でより前に現れるアルゴリズムは、 その集合でより後に現れるアルゴリズムより弱い。

現在規定されているとおり、SHA-256SHA-384 より弱く、 さらに SHA-512 より弱い。この仕様では現在、他のハッシュアルゴリズムは サポートされていない。

3.3. レスポンス検証アルゴリズム

3.3.1. algorithmbytes に適用する

  1. result を、algorithmbytes に適用した結果とする。

  2. resultbase64 符号化した結果を返す。

3.3.2. メタデータを構文解析する

文字列 metadata が与えられて メタデータを構文解析するよう求められたときは、 次の手順を実行する:

注: このアルゴリズムは、ユーザーエージェントが 理解するハッシュ関数を持つハッシュ式の集合を返す。

  1. result を空集合とする。

  2. metadata を空白で分割することによって返される各 item について:

    1. expression-and-options を、 item を U+003F (?) で 分割する結果とする。

    2. algorithm-expressionexpression-and-options[0] とする。

    3. base64-value を空文字列とする。

    4. algorithm-and-value を、 algorithm-expression を U+002D (-) で分割する結果とする。

    5. algorithmalgorithm-and-value[0] とする。

    6. algorithm有効な SRI ハッシュアルゴリズムトークンでない場合、 継続する

    7. algorithm-and-value[1] が存在する場合、 base64-valuealgorithm-and-value[1] に設定する。

    8. metadata を、順序付きマップ «["alg" → algorithm, "val" → base64-value]» とする。

      注: options は定義されていないため (§ 3.1 完全性メタデータを参照)、 対応するエントリは metadata に設定されない。将来の版で options が定義された場合、 expression-and-options[1] を options として利用できる。

    9. metadataresult付加する

  3. result を返す。

3.3.3. set から最強のメタデータを取得する

  1. result を空集合とし、strongest を null とする。

  2. set 内の各 item について:

    1. 表明:item["alg"] は有効な SRI ハッシュアルゴリズムトークンである。

    2. result が空集合である場合:

      1. itemresult付加する

      2. strongestitem に設定する。

      3. 継続する

    3. currentAlgorithmstrongest["alg"] とし、 currentAlgorithmIndex有効な SRI ハッシュアルゴリズムトークン集合内の currentAlgorithm のインデックスとする。

    4. newAlgorithmitem["alg"] とし、 newAlgorithmIndex有効な SRI ハッシュアルゴリズムトークン集合内の newAlgorithm のインデックスとする。

    5. newAlgorithmIndexcurrentAlgorithmIndex より小さい場合、 継続する

    6. そうでなく、newAlgorithmIndexcurrentAlgorithmIndex より大きい場合:

      1. strongestitem に設定する。

      2. result を « item » に設定する。

    7. そうでなければ、newAlgorithmIndexcurrentAlgorithmIndex は 同じ値である。itemresult付加する

  3. result を返す。

3.3.4. bytesmetadataList と一致するか?

  1. parsedMetadata を、 metadataList を 構文解析する結果とする。

  2. parsedMetadata が空集合である場合、 true を返す。

  3. metadata を、 parsedMetadata から最強のメタデータを取得する結果とする。

  4. metadata 内の各 item について:

    1. algorithmitem["alg"] とする。

    2. expectedValueitem["val"] とする。

    3. actualValue を、algorithmbytes に適用する 結果とする。

    4. actualValueexpectedValue と大文字小文字を区別して一致する場合、true を返す。

  5. false を返す。

このアルゴリズムにより、ユーザーエージェントは複数の有効で強いハッシュ関数を 受け入れられる。たとえば、開発者は次のような script 要素を書くかもしれない:

<script src="https://example.com/example-framework.js"
        integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7
                   sha384-+/M6kredJcxdsqkczBUjMLvqyHb1K/JThDXWsBVxMEeZHEaMKEOEct339VItX1zB"
        crossorigin="anonymous"></script>

これにより、ユーザーエージェントは 2 つの異なるコンテンツペイロードを受け入れられる。 その一方は最初の SHA-384 ハッシュ値と一致し、もう一方は 2 番目の SHA-384 ハッシュ値と一致する。

注: ユーザーエージェントは、ユーザー設定、 ブックマークレット、ユーザーエージェントへのサードパーティ追加機能、および その他のそのような仕組みによって、ユーザーがこのアルゴリズムの結果を変更できるようにしてもよい。 たとえば、HTTPS Everywhere のような拡張機能によって生成される リダイレクトは、リソースの HTTPS 版が HTTP 版と異なっていても、正しく読み込まれ 実行される可能性がある。

注: Subresource Integrity は CORS を必要とし、 CORS なしでこれを使用しようとすることは論理エラーである。 ユーザーエージェントには、この失敗を説明する警告メッセージを開発者コンソールに 報告することが奨励される。[Fetch]

3.4. HTML 文書サブリソースの検証

さまざまな HTML 要素は、文書に埋め込まれる、またはそのコンテキストで実行される リソースへのリクエストを発生させる。これらの要素の一部で完全性メタデータを サポートするため、link 要素および script 要素の コンテンツ属性のリストに新しい integrity 属性が追加される。[HTML]

注: この仕様の将来の改訂では、 すべての可能なサブリソース、すなわち aaudioembediframeimglinkobjectscriptsourcetrack、および video 要素に対する完全性サポートが含まれる可能性が高い。

3.5. integrity 属性

integrity 属性は、要素の完全性メタデータを表す。 属性の値は、空文字列、または次の ABNF 文法で説明される少なくとも 1 つの 有効なメタデータのいずれかでなければならない:

integrity-metadata = *WSP hash-with-options *(1*WSP hash-with-options ) *WSP / *WSP
hash-with-options  = hash-expression *("?" option-expression)
option-expression  = *VCHAR
hash-expression    = hash-algorithm "-" base64-value

option-expressionhash-expression ごとに関連付けられ、 それに直前する hash-expression にのみ適用される。

ユーザーエージェントが将来のオプションと完全に前方互換であり続けるため、 ユーザーエージェントは認識できないすべての option-expression を無視しなければならない。

注: option-expression は構文内で 予約されているが、オプションは定義されていないことに注意。この仕様の将来の版では オプションについてより具体的な構文を定義する可能性が高いため、ここでは可能な限り 広く定義されている。

完全性メタデータは、 要素上の integrity 属性に適用されるものと同じ integrity-metadata 文法を使用して指定されなければならない integrity リンクパラメーターとして、 `link` HTTP レスポンスヘッダーにも指定できる。たとえば:

Link: </style.css>; rel=preload; as=style;  crossorigin="anonymous"; integrity="sha256-[digest goes here]"

3.7. 完全性違反の処理

ユーザーエージェントは、完全性検査に失敗したレスポンスのレンダリングまたは実行を拒否し、 代わりに Fetch で定義されるネットワークエラーを返す。[Fetch]

注: 完全性検査に失敗すると、error イベントが発火される。正規のフォールバックリソース(たとえば、CDN から提供されないリソース、 おそらく二次的で信頼できるがより遅いソースからのリソース)を提供したい開発者は、 この error イベントを捕捉し、失敗したリソースを別のものに置き換える 適切なハンドラーを提供できる。

3.8. Integrity-Policy

Integrity-Policy および Integrity-Policy-Report-Only HTTP ヘッダーは、 文書が読み込む特定の宛先のすべてのサブリソースについて、 完全性メタデータ要件に関するポリシーを適用できるようにする。

ヘッダーの値は Dictionary [RFC9651] であり、すべての member-value は inner list of tokens である。

ソースは文字列である。 それに可能な唯一の値は "inline" である。

宛先宛先型である。それに可能な値は "script" および "style" である。

完全性ポリシーは、 次を含む構造体である:

ヘッダー リスト headersヘッダー名 headerName を伴って、 完全性ポリシーを処理するときは、次を行う:

  1. integrityPolicy を新しい完全性ポリシーとする。

  2. dictionary を、 headers から headerName と "dictionary" が与えられて 構造化フィールド値を取得する結果とする。

  3. dictionary["sources"] が存在しない場合、または その値が "inline" を含む場合、"inline" を integrityPolicysources付加する

  4. dictionary["blocked-destinations"] が存在する場合:

    1. その値が "script" を含む場合、 "script" を integrityPolicyblocked destinations付加する

    2. その値が "style" を含む場合、 "style" を integrityPolicyblocked destinations付加する

  5. dictionary["endpoints"] が存在する場合:

    1. integrityPolicyendpointsdictionary['endpoints'] に設定する。

  6. integrityPolicy を返す。

次のヘッダーブロックは、完全性メタデータなしで読み込まれる任意の外部スクリプト (または任意の no-CORS 外部スクリプト)へのリクエストをブロックする。
Integrity-Policy: blocked-destinations=(script), endpoints=(integrity-endpoint)
このブロックは、"integrity-endpoint" 報告エンドポイント(関連する Reporting-Endpoints ヘッダーによって定義される)への 報告もトリガーする。

開発者は、"integrity-violation" に対する ReportingObserver を登録して、 JavaScript ベースの 報告を取得することもできる。

3.8.1. Integrity-Policy ヘッダーを構文解析する

Response response およびポリシーコンテナー container が与えられて、 Integrity-Policy ヘッダーを構文解析するには、 次を行う:
  1. headersresponseヘッダーリストとする。

  2. headersintegrity-policy含む場合、 対応するヘッダー値を伴って 完全性ポリシーを処理することを実行した結果を、 container完全性ポリシーに設定する。

  3. headersintegrity-policy-report-only含む場合、 対応するヘッダー値を伴って 完全性ポリシーを処理することを実行した結果を、 container報告専用完全性ポリシーに設定する。

3.8.2. リクエストは Integrity Policy によってブロックされるべきか

request request が与えられて、 リクエストは完全性ポリシーによってブロックされるべきかを 決定するには、次を行う:
  1. policyContainerrequestポリシーコンテナーとする。

  2. parsedMetadata を、 request完全性メタデータを伴って メタデータを構文解析するを呼び出した結果とする。

  3. parsedMetadata が空集合でなく、 requestmode が "cors" または "same-origin" のいずれかである場合、 "Allowed" を返す。

  4. requesturlローカルである場合、 "Allowed" を返す。

  5. policypolicyContainer完全性ポリシーとする。

  6. reportPolicypolicyContainer報告専用完全性ポリシーとする。

  7. policyreportPolicy の両方が空の 完全性ポリシーである場合、"Allowed" を返す。

  8. global を、requestclientグローバルオブジェクトとする。

  9. globalWindow でも WorkerGlobalScope でもない場合、"Allowed" を返す。

  10. block を boolean とし、初期値を false とする。

  11. reportBlock を boolean とし、初期値を false とする。

  12. policysources が "inline" を含み、 かつ policyblocked destinationsrequestdestination含む場合、 block を true に設定する。

  13. reportPolicysources が "inline" を含み、 かつ reportPolicyblocked destinationsrequestdestination含む場合、 reportBlock を true に設定する。

  14. block が true または reportBlock が true である場合、 requestblockreportBlockpolicy および reportPolicy を伴って 違反を報告する

  15. block が true である場合は "Blocked" を返し、そうでなければ "Allowed" を返す。

3.8.3. 違反を報告する

dictionary IntegrityViolationReportBody : ReportBody {
  USVString documentURL;
  USVString blockedURL;
  USVString destination;
  boolean   reportOnly;
};

Request request、boolean block、 boolean reportBlock完全性ポリシー policy、 および完全性ポリシー reportPolicy が与えられて 違反を報告するには、 次を行う:

  1. 表明requestclient は null でない。

  2. settingsObjectrequestclientとする。

  3. globalsettingsObjectグローバルオブジェクトとする。

  4. 表明globalWindow または WorkerGlobalScope である。

  5. url を null とする。

  6. globalWindow である場合、 urlglobal関連付けられた DocumentURL に設定する。

  7. globalWorkerGlobalScope である場合、 urlglobalURL に設定する。

  8. 表明urlURLである。

  9. documentURL を、url に対して 報告で使用するために URL を剥ぎ取る結果とする。

  10. blockedURL を、 requestURLに対して 報告で使用するために URL を剥ぎ取る結果とする。

  11. block が true である場合、policyendpoints 内の各 endpoint について:

    1. body を、次のように初期化された新しい IntegrityViolationReportBody とする:

      documentURL

      documentURL

      blockedURL

      blockedURL

      destination

      requestdestination

      reportOnly

      false

    2. 次の引数で報告を生成してキューに入れる

      context

      settingsObject

      type

      "integrity-violation"

      destination

      endpoint

      data

      body

  12. reportBlock が true である場合、reportPolicyendpoints 内の各 endpoint について:

    1. reportBody を、次のように初期化された新しい IntegrityViolationReportBody とする:

      documentURL

      documentURL

      blockedURL

      blockedURL

      destination

      requestdestination

      reportOnly

      true

    2. 次の引数で報告を生成してキューに入れる

      context

      settingsObject

      type

      "integrity-violation"

      destination

      endpoint

      data

      reportBody

4. プロキシ

レスポンスを変更する最適化プロキシおよびその他の中間サーバーは、 それらのレスポンスに関連付けられたダイジェストが 新しいコンテンツと同期したままであることを保証しなければならない。 1 つの選択肢は、リソースに関連付けられた 完全性メタデータが 更新されることを保証することである。別の選択肢は、ページ作者が完全性検証を 要求したリソースについては、単にリソースの正規版だけを配信することである。

中間サーバーに情報を伝えるため、それらのリソースを提供する側は、 リソースとともに、値が no-transform である Cache-Control ヘッダーを 送信すべきである。

5. セキュリティおよびプライバシーに関する考慮事項

この節は規範的ではない。

5.1. 非セキュアなコンテキストは非セキュアなままである

HTTP ページなど、Secure Context でないコンテキストによって配信される 完全性メタデータは、 外部リソースがホストされているサーバーの侵害からオリジンを保護するだけである。 ネットワーク攻撃者は、ハッシュが検証するはずのレスポンスを改変できるのと同じように、 転送中のダイジェストを改変できる(または完全に削除できる、あるいは文書に対して まったく何でもできる)。したがって、作者は完全性メタデータを Secure Context にのみ配信することが推奨される。Securing the Web も参照。

5.2. ハッシュ衝突攻撃

ダイジェストの強度は、それを生成するために使用されるハッシュ関数の強度に依存する。 ユーザーエージェントは、既知の弱いハッシュ関数のサポートを拒否し、サポートする アルゴリズムを衝突耐性があると知られているものに限定することが推奨される。 推奨されないハッシュ関数の例には MD5 および SHA-1 が含まれる。執筆時点では、 SHA-384 がよい基準である。

さらに、ユーザーエージェントはサポートするハッシュ関数を定期的に再評価し、 安全でないことが示された関数のサポートを非推奨にすることが推奨される。 時間の経過とともに、ハッシュ関数は予想よりはるかに弱いことが示される可能性があり、 場合によっては破られる可能性もあるため、ユーザーエージェントがこれらの進展を 把握し続けることが重要である。

5.3. クロスオリジンデータ漏えい

この仕様は、完全性で保護されたクロスオリジンリクエストが CORS プロトコルを使用し、リソースのコンテンツがリクエスト元と明示的に共有されていることを 保証することを要求する。この要件が省略された場合、 攻撃者は同一オリジン ポリシー に違反し、クロスオリジンリソースが特定のコンテンツを持つかどうかを判断できる。

攻撃者は既知のダイジェストでリソースを読み込もうとし、読み込み失敗を 監視するだろう。読み込みが失敗した場合、攻撃者はレスポンスがハッシュと 一致しなかったと推測でき、それによってその内容に関する何らかの洞察を得られる。 これは、たとえばユーザーが特定のサービスにログインしているかどうかを明らかにする 可能性がある。

さらに、攻撃者は、それ以外は静的なリソース内の特定の値をブルートフォースできる。 次のような JSON レスポンスを考える:

{"status": "authenticated", "username": "admin"}

攻撃者は、さまざまな一般的なユーザー名を持つレスポンスのハッシュを事前計算し、 文書の読み込みを繰り返し試みながらそれらのハッシュを指定できる。読み込みに成功すると、 攻撃者がユーザー名を正しく推測したことが確認される。

6. 謝辞

ここにある内容の多くは、Gervase Markham の Link Fingerprints の概念、および WHATWG の Link Hashes に 大きく触発されている。

この仕様の初期版への貴重な貢献について Mike West に特別な感謝を述べる。 また、貴重なフィードバックを提供してくれた Brad Hill、Anne van Kesteren、Jonathan Kingston、Fatih Kilic、Mark Nottingham、Sergey Shekyan、Dan Veditz、Eduardo Vela、 Tanvi Vyas、Yoav Weiss、および Michal Zalewski に感謝する。

適合性

文書の 表記規約

適合要件は、説明的な表明と RFC 2119 用語の組み合わせで表現される。 この文書の規範的部分におけるキーワード “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY”、および “OPTIONAL” は、RFC 2119 で説明されるとおりに解釈される。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限らない。

この仕様のすべてのテキストは、 非規範的であると明示的に示された節、例、および注を除き、規範的である。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 class="example" によって 規範的テキストから区別される。 次のように:

これは参考情報としての例の一例である。

参考情報としての注は “Note” という語で始まり、 class="note" によって 規範的テキストから区別される。 次のように:

Note, これは参考情報としての注である。

テスト

この仕様の内容に関連するテストは、 このような “Tests” ブロックに記録される場合がある。 そのようなブロックはいずれも非規範的である。


適合 アルゴリズム

アルゴリズムの一部として命令形で述べられた要件 (たとえば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must"、"should"、"may" など)の意味で解釈される。

アルゴリズムまたは特定の手順として述べられた適合要件は、 最終結果が同等である限り、 どのような方法で実装してもよい。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、 性能が高いことを意図していない。 実装者には最適化が推奨される。

索引

この仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[ABNF]
D. Crocker, Ed.; P. Overell. Augmented BNF for Syntax Specifications: ABNF. 2008年1月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc5234
[CSP]
Mike West; Antonio Sartori. Content Security Policy Level 3. 2026年3月11日。WD。URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard。 URL: https://dom.spec.whatwg.org/
[Fetch]
Anne van Kesteren. Fetch Standard. Living Standard。URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard。URL: https://infra.spec.whatwg.org/
[MIME-TYPES]
N. Freed; N. Borenstein. Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. 1996年11月。Draft Standard。URL: https://www.rfc-editor.org/rfc/rfc2046
[REPORTING-1]
Douglas Creager; Ian Clelland; Mike West. Reporting API. 2025年6月11日。WD。URL: https://www.w3.org/TR/reporting-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC4648]
S. Josefsson. The Base16, Base32, and Base64 Data Encodings. 2006年10月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC7234]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. Hypertext Transfer Protocol (HTTP/1.1): Caching. 2014年6月。Proposed Standard。URL: https://httpwg.org/specs/rfc7234.html
[RFC8288]
M. Nottingham. Web Linking. 2017年10月。 Proposed Standard。URL: https://httpwg.org/specs/rfc8288.html
[RFC9651]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. 2024年9月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc9651
[SHA2]
FIPS PUB 180-4, Secure Hash Standard. URL: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
[URL]
Anne van Kesteren. URL Standard. Living Standard。 URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard。URL: https://webidl.spec.whatwg.org/

参考情報の参考文献

[RFC1035]
P. Mockapetris. Domain names - implementation and specification. 1987年11月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc1035
[RFC6797]
J. Hodges; C. Jackson; A. Barth. HTTP Strict Transport Security (HSTS). 2012年11月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc6797
[RFC7469]
C. Evans; C. Palmer; R. Sleevi. Public Key Pinning Extension for HTTP. 2015年4月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc7469
[TLS]
E. Rescorla. The Transport Layer Security (TLS) Protocol Version 1.3. 2018年8月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc8446

IDL 索引

dictionary IntegrityViolationReportBody : ReportBody {
  USVString documentURL;
  USVString blockedURL;
  USVString destination;
  boolean   reportOnly;
};