Subresource Integrity (SRI) is een beveiliging dat browsers in staat stelt om bestanden (van bijvoorbeeld een CDN) te verifieëren dat ze zijn geleverd zonder onverwachte manipulatie (door een derde partij). Het werkt door het bestand te vergelijken met een cryptografische hash dat u doorgeeft.

Hoe Subresource Integrity helpt

Het gebruik van Content Delivery Networks (CDNs) om bestanden  te hosten zoals scripts en stylesheets dat gedeeld zijn over meerdere websites kan positief zijn voor de snelheid en bandbreedte. Maar met CDNs komt er ook een risico, als een aanvaller (hacker) de controle overneemt van de CDN, kan hij malicieuze code in de bestanden van de CDN injecteren  (of ze compleet vervangen) en kan dus ook alle websites aanvallen die de CDN gebruiken.

de Subresource Integrity optie stelt jouw in staat om dit risico te minimaliseren, door te garanderen dat de bestanden van je Web applicatie of Web document opvraagt (van een  CDN of ergens anders) geleverd zijn zonder dat een derde partij de inhoud veranderd of ingevoegd heeft.

Gebruik van Subresource Integrity

Je gebruikt de Subresource Integrity optie door het specifiëren van een base64-ge-encodeerd cryptografische hash van een bron (file) dat je de browser op haalt, in de waarde van de integrity attribuut van een  <script> of <link> element.

Een integrity value begint met minstens één string, elke string bevat een voorvoegsel wat een bepaald hash algorithme aanduid (op dit moment zijn sha256, sha384, en sha512 toegelaten)  , gevolgd door een "-", en eindigt met de base64-geëncodeerde hash.

Een integrity waarde mag meerdere hashes bevatten, wordt gesplist door een spatie. Een bron zal geladen worden als het aan één van de hashes voldoet.

een voorbeeld integrity string met base64-encoded sha384 hash:

sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC

Een integrity waarde “hash” deel is, een cryptographic digest gevormd door het toepasen van een beppaalde hash functie op een input (bijvoorbeeld, een script of stylesheet bestand). Maar het is gebruikelijk om  hash te gebruiken i.p.v. cryptographic digest, wordt ook zo verder gebruikt in het artikel.

Hulpmiddellen voor het genereren van SRI hashes

Je kan SRI hashes genereren  vanaf de command-line met openssl door dit commando op te roepen:

cat FILENAME.js | openssl dgst -sha384 -binary | openssl enc -base64 -A         

of met shasum met een oproep zoals deze:

shasum -b -a 384 FILENAME.js | xxd -r -p | base64

Een alternatief voor de command-line, is de SRI Hash Generator (https://srihash.org/ ), dit is een online hulpmiddel voor het genereren van SRI hashes.

Content Security Policy en Subresource Integrity

Je kan Content Security Policy gebruiken om je server te laten afdwingen dat bepaalde type bestanden Subresource Integrity moet gebruiken. Doe dit met require-sri-for richtlijn in de CSP header. voorbeeld:

Content-Security-Policy: require-sri-for script;

Dit verplicht dat elk javaScript bestand een SRI moet hebben en dat deze ook geldig is.

Hetzelfde kan ook voor stylesheets:

Content-Security-Policy: require-sri-for style;

Je kan ze ook voor beide script en style specifiëren.

voorbeelden

In de volgende voorbeelden, neem aan dat oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC de verwachte SHA-384 hash waarde is van het script example-framework.js, en er is een kopie gehost op https://example.com/example-framework.js.

Subresource Integrity met het script element

Je kan gebruik maken van het <script> element, om de browser te verwittigen dat voor de uitvoering van https://example.com/example-framework.js script. Het eerst moet vergelijken met de verwachte hash in de integrity attribuut.

<script src="https://example.com/example-framework.js"
        integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
        crossorigin="anonymous"></script>

Voor meer details over de crossorigin attribuut, zie CORS attributen.

Hoe browsers Subresource Integrity gebruiken

Browsers gebruiken SRI op deze manier:

  1. Wanneer een browser een <script> of <link> element tegenkomt met een integrity attribuut, zal de browser voor de uitvoering van de script of het toepassen van de stijlregels, de script of stylesheet vergelijken met de verwachte hash in de integrity attribuut.
  2. Als het script of stylesheet niet de voldoet aan de verwachte waarde in de integrity attribuut, dan zal de browser het script of stylesheet blokkeren (weigeren om te voeren of toe te passen), en zal het een network error teruggeven om aan te duiden dat het ophalen van een script of stylesheet gefaald is.

Specificaties

Specification Status Comment
Subresource Integrity Recommendation  
Fetch Living Standard  

Browser compatibiliteit

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

optie Chrome Firefox (Gecko) Internet Explorer Opera Safari
de integrity attribuut voor <script> en <link> 45.0 43 (43) Niet ondersteund 32 11 [1]
de CSP require-sri-for richtlijn ? 49 (49) [2] ? ? ?
optie Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
de integrity attribuut voor <script> en <link> 45.0 43.0 (43) Niet ondersteund Niet ondersteund 11 [1]
de CSP require-sri-for richtlijn ? 49.0 (49) [2] ? ? ?

[1] WebKit bug 148363
[2] Behind the security.csp.experimentalEnabled about:config preference.

Zie ook

Documentlabels en -medewerkers

Aan deze pagina hebben bijgedragen: tibovanheule
Laatst bijgewerkt door: tibovanheule,