Subresource Integrity (SRI) is een beveiliging dat browsers in staat stelt om bestanden (van bijvoorbeeld een CDN) te verifië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 bestaat 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. Hij kan dus ook alle websites aanvallen die de CDN gebruiken.

De Subresource Integrity 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 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 enkel sha256, sha384, en sha512 toegelaten)  , gevolgd door een "-", en eindigt met de base64-geëncodeerde hash.

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

Een voorbeeld van een integrity string met base64-encoded sha384 hash:

sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC

Een integrity deelwaarde “hash” is een cryptographic digest gevormd door het toepasen van een bepaalde hash functie op een input (bijvoorbeeld, een script of stylesheet bestand). Maar het is gebruikelijk om hash te gebruiken i.p.v. cryptographic digest. Het 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 | awk '{ print $1 }' | xxd -r -p | base64

Notes:

  • Het commando xxd neemt de hexadecimale uitvoer van shasum en zet het om in binair.
  • Het awk commando is nodig omdat shasum ook de gehashed bestandnaam zal mee doorgeven aan xxd. Dat kan erge gevolgen hebben, als het bestandnaam ook hex kararkters bevat — omdat xxd het ook zal decoderen en doorgeven aan base64.

Een alternatief voor de command-line, is de SRI Hash Generator (https://www.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.

 

Cross-Origin Resource Sharing and Subresource Integrity

Browsers Controleren ook het resource met Cross-Origin Resource Sharing (CORS), zo kijkt men als het gebruikte gebruikt mag worden door de opvrager. Een bestand moet dus doorgegeven worden met een Access-Control-Allow-Origin header dat toe laat dat het bestand gedeeld word met de vragende bron. Als voorbeeld:

Access-Control-Allow-Origin: *

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 dat er een kopie gehost is 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 nog voor de uitvoering van het script of het toepassen van de stijlregels. Het 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). Het zal 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

<script integrity>

Sectie

Update compatibility data on GitHub
DesktopMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome voor AndroidFirefox voor AndroidOpera voor AndroidSafari op iOSSamsung Internet
integrityChrome Volledige ondersteuning 45Edge Gedeeltelijke ondersteuning 17Firefox Volledige ondersteuning 43IE Geen ondersteuning NeeOpera Volledige ondersteuning JaSafari Volledige ondersteuning JaWebView Android Volledige ondersteuning 45Chrome Android Volledige ondersteuning 45Firefox Android Volledige ondersteuning 43Opera Android ? Safari iOS Geen ondersteuning NeeSamsung Internet Android Volledige ondersteuning 5.0

Legenda

Volledige ondersteuning  
Volledige ondersteuning
Gedeeltelijke ondersteuning  
Gedeeltelijke ondersteuning
Geen ondersteuning  
Geen ondersteuning
Compatibiliteit onbekend  
Compatibiliteit onbekend

CSP: require-sri-for

Sectie

No compatibility data found. Please contribute data for "http.headers.csp.require-sri-for" (depth: 1) to the MDN compatibility data repository.

 

 

Zie ook

 

Documentlabels en -medewerkers

Aan deze pagina hebben bijgedragen: bvanmastrigt, mdnwebdocs-bot, tibovanheule
Laatst bijgewerkt door: bvanmastrigt,