【エスアールアイ】

SRI(サブリソース完全性) とは?

最終更新:
💡 使う前に、指定したファイルの内容か確かめる

読み込むJavaScriptやCSSなどの内容を、HTMLに指定した期待ハッシュとブラウザが照合する仕組み。正しいハッシュを設定しておけば、不一致のリソースの利用を防ぐ助けになります。

📌 このページのポイント
SRI:使う前に内容を照合するHTMLの期待ハッシュ確認した内容から設定取得したJS・CSSブラウザーでハッシュ計算有効な期待値と照合する一致対象を利用できる不一致対象の利用を拒否一致しても、コードの無害さは保証しない
有効なintegrityを指定した対応ブラウザーでの模式図です。別オリジンではCORSの許可も確認します。HTMLと期待値の信頼性は別に守り、正規更新では期待値も管理します。
ひよこ ひよこ
SRIは何を確かめるの?
ペンギン先生 ペンギン先生
HTMLのintegrity属性に指定したハッシュと、取得したJSやCSSの内容を照合するよ。有効な期待値と一致しなければ、そのスクリプトの実行やスタイルの適用を拒否する。ファイルを書き換えられなくする仕組みではないんだ。
ひよこ ひよこ
CDNを使うときだけ必要?
ペンギン先生 ペンギン先生
第三者の配信元の変更や攻撃に備える用途が代表的だけど、外部CDN限定ではないよ。大切なのは、確認済みの内容から期待ハッシュを用意すること。危険なコードでも、その期待値を登録してしまえば一致するから、無害さの検査にはならないんだ。
ひよこ ひよこ
どのように指定するの?
ペンギン先生 ペンギン先生
例えばintegrity="sha384-実際のBase64ハッシュ"をscriptに付ける。これは書式の説明で、そのまま使える値ではないよ。SHA-256・384・512に対応し、複数を指定した場合はブラウザが対応する最も強いアルゴリズムの値を使う。
ひよこ ひよこ
crossoriginを書けば十分?
ペンギン先生 ペンギン先生
別オリジンのファイルでは、例えばcrossorigin="anonymous"でCORS方式の読み込みにし、配信側もAccess-Control-Allow-Originで許可する必要がある。属性だけでは配信側の許可を追加できないし、CORSに失敗すると読み込めないよ。
ひよこ ひよこ
導入してから何を確認する?
ペンギン先生 ペンギン先生
ファイルの版と取得した内容、integrityの値、CORS、ブラウザのエラーを確認しよう。正規更新でもハッシュが変わるので、版を固定したURLと期待値を一緒に管理する。HTMLと期待ハッシュも書き換えられる攻撃には、SRIだけでは対処できないよ。
もっと詳しく知りたい人へ

HTMLとintegrityの値も書き換えられたら?

改ざん後のファイルに合うハッシュへ変えられれば照合は通ってしまいます。SRIは文書そのものを守る仕組みではありません。HTMLをHTTPSで届けることや、配信・更新の権限を管理することも必要です。期待値を信頼できる状態で用意しましょう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「SRI」って出てきたら「ブラウザが読み込む内容を期待ハッシュと照合する仕組み」と思えばだいたいOK!比較するハッシュ値自体が信頼できることも大切だよ。
📖 おまけ:英語の意味
「Subresource Integrity」 = サブリソースの完全性
💬 サブリソースは文書が読み込むスクリプトやスタイルなどです。Integrityは内容の完全性であり、提供元の本人確認やプログラムの無害さまで保証する言葉ではありません。

参考資料

← 用語集にもどる