サブリソース整合性

W3C作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-sri-2-20250710/
最新版:
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アプリケーションセキュリティ作業グループ によって、勧告プロセスに従い作業草案として公開されました。本書はW3C勧告となることを意図しています。

(アーカイブ) 公開メーリングリスト public-webappsec@w3.org (投稿方法参照) が本仕様の議論に推奨されます。 メール送信時は件名に「sri」を含めてください。例えば: 「[sri] …コメント概要…

作業草案としての公開は、W3Cおよびその会員による承認を意味しません。本書はドラフト文書であり、随時更新・差し替え・廃止される可能性があります。進行中の作業以外として引用するのは不適切です。

本書は Webアプリケーションセキュリティ作業グループ によって作成されました。

本書は W3C特許方針の下で活動するグループによって作成されました。 W3Cはグループ成果物に関して特許開示の公開リストを管理しています。 特許開示方法についても記載されています。 本人が必須な特許請求を含むと認識した特許を知っている場合は、W3C特許方針第6節に従い開示しなければなりません。

本書は2023年11月3日W3Cプロセス文書の管理下にあります。

1. はじめに

ウェブ上のサイトやアプリケーションは、単一オリジンのリソースだけで構成されることはほとんどありません。例えば、著者は様々なサービスやコンテンツ配信ネットワーク(CDN)からスクリプトやスタイルを取得し、配信された内容が本当に期待したものかを信頼する必要があります。攻撃者がユーザーを悪意あるサーバーからコンテンツをダウンロードさせるよう誘導した場合(DNS [RFC1035]ポイズニングなど)、著者には対処手段がありません。同様に、攻撃者がCDNサーバー上のファイルを置き換えることができれば、任意のコンテンツを注入することも可能です。

安全なチャネルを通じてリソースを配信することで、このリスクの一部は軽減できます。TLS [TLS]、HSTS [RFC6797]、公開鍵ピンニング[RFC7469]によって、ユーザーエージェントは本当に意図したサーバーと通信していることをかなり確信できます。しかし、これらの仕組みはサーバーのみを認証し、コンテンツ自体は認証しません。サーバーへのアクセス権を持つ攻撃者(や管理者)は、自由にコンテンツを改ざんできます。理想的には、著者がサーバーの鍵だけでなくコンテンツもピン留めできれば、リソースの正確な内容だけが読み込まれ、実行されることを保証できます。

本書はそのような検証方式を定義し、2つのHTML要素にintegrity属性を拡張します。この属性には、著者が期待するリソースの内容の暗号学的ハッシュ値を格納します。例えば、著者がフレームワークを自身のオリジンではなく共有サーバーから読み込む場合、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-384SHA-512は、NISTが定義するSHA-2暗号学的ハッシュ関数群の一部です。[SHA2]

有効なSRIハッシュアルゴリズムトークン集合は、順序付き集合« "sha256", "sha384", "sha512" »(それぞれSHA-256SHA-384SHA-512に対応)。この集合の順序は意味を持ち、より強力なアルゴリズムが後ろに並びます。詳細は§ 3.2.2 優先順位および§ 3.3.3 集合から最強のメタデータを取得を参照してください。

文字列が有効なSRIハッシュアルゴリズムトークンであるとは、そのASCII小文字化含まれている場合、有効なSRIハッシュアルゴリズムトークン集合に含まれることを指します。

2.1. 文法上の概念

この文書で使用される拡張バッカス・ナウア形式(ABNF)記法はRFC5234で定義されています。[ABNF]

RFC5234の付録B.1は、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-384SHA-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 集合から最強のメタデータを取得のアルゴリズム参照)。

ハッシュ関数が安全でないと判断された場合、ユーザーエージェントはそのハッシュ関数による整合性検証のサポートを非推奨とし、最終的に削除すべきです。ユーザーエージェントは非推奨関数によるダイジェストでレスポンスの妥当性をチェックしてもかまいません。

著者が古いユーザーエージェントに縛られず強力なハッシュ関数へ切り替えられるよう、サポートされていないハッシュ関数による検証は整合性値が未指定の場合と同様に扱われます(§ 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ハッシュアルゴリズムトークンでなければ、continueする。

    7. もしalgorithm-and-value[1]が存在すればbase64-valuealgorithm-and-value[1]に設定する。

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

      注: オプションは定義されていないため(§ 3.1 整合性メタデータ参照)、対応するエントリはmetadataに設定しません。将来バージョンでオプションが定義された場合、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. resultitemを追加。

      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が同じ値なら、resultitemを追加。

  3. resultを返す。

3.3.4. bytesmetadataListに一致するか?

  1. parsedMetadataを、metadataListを解析した結果とする。

  2. もしparsedMetadata空集合なら、trueを返す。

  3. metadataparsedMetadataから最強のメタデータを取得した結果とする。

  4. metadataの各itemについて:

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

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

    3. actualValuealgorithmbytesへ適用した結果とする。

    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つの異なるコンテンツペイロードのいずれかを受理できます。1つは1つ目のSHA-384ハッシュ値と一致し、もう1つは2つ目のSHA-384ハッシュ値と一致します。

注: ユーザーエージェントはユーザーの設定、ブックマークレット、サードパーティ追加機能などでこのアルゴリズムの結果を変更できる場合があります。例えばHTTPS Everywhereのような拡張によるリダイレクトでも、リソースのHTTPS版とHTTP版が異なっていても、正常に読み込み・実行されることがあります。

注: サブリソース整合性にはCORSが必要です。CORSなしで利用しようとすると論理エラーとなるため、ユーザーエージェントは開発者コンソールで警告メッセージを報告することが推奨されます。[Fetch]

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

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

注: 本仕様の将来バージョンでは、aaudioembediframeimglinkobjectscriptsourcetrackvideoなど、全てのサブリソース要素で整合性サポートが追加される可能性があります。

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-expressionは各hash-expressionごとに関連付けられ、その直前のhash-expressionのみに適用されます。

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

注: option-expressionは構文上予約されているものの、現時点ではオプションは定義されていません。将来の仕様バージョンではより具体的なオプション構文が定義される可能性が高いため、現段階ではできるだけ広く定義されています。

整合性メタデータは `link` HTTPレスポンスヘッダーにも、integrityリンクパラメータとして指定できます。この場合も要素のintegrity属性と同じintegrity-metadata文法で指定しなければなりません。例:

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ヘッダーは、ドキュメントが読み込む特定のdestinationのサブリソースすべてに対する整合性メタデータ要件のポリシーを強制できます。

ヘッダー値は辞書型で、各メンバー値は内部リストであり、トークンのリストです。[RFC9651]

sourceは文字列で、値は"inline"のみです。

destinationdestination typeであり、値は"script"と"style"です。

整合性ポリシーは、以下を含む構造体です:

整合性ポリシーの処理は、header list headersheader name headerNameで以下のように行う:

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

  2. dictionaryを、構造化フィールド値を取得した結果とする(headersheaderName、"dictionary"を与える)。

  3. もしdictionary["sources"]が存在しないか、その値が"inline"を含む場合は、integrityPolicyのsourcesに"inline"を追加。

  4. もしdictionary["blocked-destinations"]が存在するなら:

    1. その値が"script"を含むなら、integrityPolicyのblocked destinationsに"script"を追加。

    2. その値が"style"を含むなら、integrityPolicyのblocked destinationsに"style"を追加。

  5. もしdictionary["endpoints"]が存在するなら:

    1. integrityPolicyのendpointsdictionary['endpoints']に設定。

  6. integrityPolicyを返す。

次のヘッダーは、integrityメタデータなしで読み込まれる外部スクリプト(またはno-CORS外部スクリプト)のリクエストをブロックします。
Integrity-Policy: blocked-destinations=(script), endpoints=(integrity-endpoint)

このブロックにより、"integrity-endpoint"レポートエンドポイント(対応するReporting-Endpointsヘッダーで定義)にレポートも発行されます。

開発者は"integrity-violation"のReportingObserverを登録することで、JavaScriptでレポートを取得することもできます。

3.8.1. Integrity-Policyヘッダーの解析

Integrity-Policyヘッダーを解析するには、Response response およびpolicy container containerが与えられたとき、以下を行う:
  1. headersresponseヘッダーリストとする。

  2. もしheadersintegrity-policyを含むなら、 containerintegrity policyを 対応する整合性ポリシーの処理の結果に設定する。 (対応するヘッダー値を使用)

  3. もしheadersintegrity-policy-report-onlyを含むなら、 containerreport only integrity policyを 対応する整合性ポリシーの処理の結果に設定する。 (対応するヘッダー値を使用)

3.8.2. Integrity Policyによるリクエストのブロック可否

Integrity Policyによるリクエストのブロック可否を判定するには、 request requestが与えられたとき、以下を行う:
  1. policyContainerrequestpolicy containerとする。

  2. parsedMetadataparse metadatarequestintegrity metadataを渡して得られる結果とする。

  3. もしparsedMetadataが空集合ではなく、かつrequestmodeが"cors"または"same-origin"なら、 "Allowed"を返す。

  4. もしrequesturllocalなら、 "Allowed"を返す。

  5. policypolicyContainerintegrity policyとする。

  6. reportPolicypolicyContainerreport only integrity policy とする。

  7. もしpolicyreportPolicyが両方とも空の整合性ポリシーなら、"Allowed"を返す。

  8. globalrequestclientglobal objectとする。

  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またはreportBlockがtrueなら、違反を報告request, block, reportBlock, policy, 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. globalsettingsObjectglobal objectとする。

  4. 保証globalWindow またはWorkerGlobalScopeである。

  5. urlをnullとする。

  6. もしglobalWindowなら、 urlglobal関連付けられたDocumentURLに設定。

  7. もしglobalWorkerGlobalScopeなら、 urlglobalURLに設定。

  8. 保証urlURLである。

  9. documentURLurlをレポート用にストリップした結果とする。

  10. blockedURLを、requestURLレポート用URLストリップを適用した結果とする。

  11. もしblockがtrueなら、policyのendpointsの各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なら、reportPolicyのendpointsの各endpointについて:

    1. reportBodyを新しいIntegrityViolationReportBodyとして、以下で初期化:

      documentURL

      documentURL

      blockedURL

      blockedURL

      destination

      requestdestination

      reportOnly

      true

    2. レポート生成とキューイングを以下の引数で呼び出す:

      context

      settingsObject

      type

      "integrity-violation"

      destination

      endpoint

      data

      reportBody

4. プロキシ

最適化プロキシやレスポンスを変更するその他の中間サーバーは、これらのレスポンスに関連付けられたダイジェストが新しいコンテンツと同期していることを必ず保証しなければなりません。1つの選択肢は、リソースに関連付けられた整合性メタデータを更新することです。もう1つは、ページ著者が整合性検証を要求したリソースの正規バージョンのみを配信することです。

中間サーバーへの通知を支援するため、リソースを配信するサーバーは、リソースとともにCache-Controlヘッダーを値no-transformで送信するべきです。

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

このセクションは規範的ではありません。

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

整合性メタデータ がHTTPページなどのセキュアコンテキスト以外のコンテキストから配信された場合、外部リソースがホストされているサーバーの侵害のみからオリジンを保護します。ネットワーク攻撃者はダイジェストを途中で改変したり(あるいは完全に削除したり、その他文書に対し何でも)でき、ハッシュで検証しようとするレスポンス自体も改変可能です。そのため、著者はセキュアコンテキストでのみ整合性メタデータを配信することを推奨します。関連: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”ブロックで記載される場合があります。 そのようなブロックは全て非規範的です。


適合アルゴリズム

アルゴリズムの一部として命令形で記述された要件("先頭の空白文字をすべて削除する"や"falseを返してこれらの手順を中止する"など)は、アルゴリズム導入時に使われたキーワード("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. 2025年6月30日。WD。URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. DOM標準。現行標準。URL: https://dom.spec.whatwg.org/
[Fetch]
Anne van Kesteren. Fetch標準。現行標準。URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他。 HTML標準。現行標準。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra標準。現行標準。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標準。現行標準。URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準。現行標準。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. Transport Layer Security (TLS)プロトコル 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;
};