Subresource Integrity (SRI)

とは

外部リソースが改ざんされていない事をチェックする。CDN経由で配信されるJavaScriptが改ざんされて要らん事されないようにする事を想定。

方法

ブラウザが受け取った外部リソースからintegrity属性値に指定したハッシュアルゴリズムでハッシュを生成し、同じくintegrity属性値で指定したハッシュ値と合致している事を確認し、合致している場合にその外部リソースを適用する。

integrity属性は今のところlink rel=stylesheetscriptにしか指定できないが、今後はあらゆる外部リソースを読み込む要素に展開される可能性がある。併せてcrossorigin属性を指定する必要がある。

念の為だが、リソースがhttpsの場合に限らずチェックされる。

構文

一部独自に分かりやすくしている。仕様書の式だと空白区切りの場所では改行が使えないっぽいけど、例文を見る限り使っても良さそう。

構文の通り複数のintegrityソースを指定可能になっている。複数指定された場合は利用可能なうち最も強いアルゴリズムが使われる。例えば以下の場合:

<script src="hello_world.js"
integrity="sha384-dOTZf16X8p34q2/kYyEFm0jh89uTjikhnzjeLeF0FHsEaYKb1A1cv+Lyv4Hk8vHd
sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw=="
crossorigin="anonymous"></script>

ブラウザがsha512をサポートしている場合はsha512のほうのみが利用され、sha384の指定は無視される。ブラウザがsha512をサポートしておらずsha384のみをサポートしている場合は、sha384のほうが利用される。

同じ強度のintegrityソースが複数指定されている場合、いずれかにマッチすればOK。例えば以下のような指定が可能:

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

ハッシュの生成方法

SRI Hash GeneratorというSRI向けのハッシュを生成してくれるサイトがある。

opensslのコマンドを用いて以下のように生成する事も可能:

curl https://www.example.com/example.js | openssl dgst -sha512 -binary | openssl base64 -A

integrityの利用を強制する

通常はintegrity属性の指定がある場合にのみチェックされるが、Content Security Policy (CSP)のrequire-sri-forディレクティブを指定する事で、integrity属性の指定を強制する事ができる。

Content Security Policy (CSP)のhashソースとの違い

類似のものにCSPのhashソースがあるが、以下の点で異なる:

各ブラウザでの実装状況

テストしたブラウザのバージョン

参考