Subresource Integrity
Subresource Integrity (SRI) ist ein Sicherheitsmerkmal, das es Browsern ermöglicht, zu überprüfen, dass die von ihnen abgerufenen Ressourcen (zum Beispiel von einem CDN) ohne unerwartete Manipulation geliefert werden. Dies geschieht, indem Sie dem Browser einen kryptographischen Hash bereitstellen, den eine abgerufene Ressource erfüllen muss.
Hinweis: Für die Subresource-Integrity-Verifizierung einer Ressource, die von einem anderen Ursprung als dem des eingebetteten Dokuments bereitgestellt wird, überprüfen Browser die Ressource zusätzlich mittels Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource bereitstellt, es erlaubt, mit dem anfordernden Ursprung geteilt zu werden.
Wie Subresource Integrity hilft
Webseiten entscheiden sich manchmal dafür, sich auf Dritte wie ein Content Delivery Network (CDN) zu verlassen, um einige ihrer Ressourcen zu hosten, anstatt alle Ressourcen selbst zu hosten. Beispielsweise könnte ein Dokument von https://example.com
eine Ressource von einem anderen Ort einbinden:
<script src="https://not-example.com/script.js"></script>
Dies birgt das Risiko, dass ein Angreifer, wenn er die Kontrolle über den Drittanbieter gewinnt, beliebigen bösartigen Inhalt in seine Dateien einschleusen (oder die Dateien komplett ersetzen) und somit potenziell auch Websites angreifen kann, die Dateien von dort abrufen.
Subresource Integrity ermöglicht es Ihnen, einige Risiken von Angriffen wie diesem zu mindern, indem sichergestellt wird, dass die Dateien, die Ihre Webanwendung oder Ihr Webdokument abruft, ohne dass ein Angreifer zusätzlichen Inhalt in diese Dateien eingebracht hat, geliefert werden — und dass keinerlei Änderungen jeglicher Art an diesen Dateien vorgenommen wurden.
Verwendung von Subresource Integrity
Sie nutzen die Subresource Integrity-Funktion, indem Sie einen base64-codierten kryptographischen Hash einer Ressource (Datei), von der Sie dem Browser sagen, er solle sie abrufen, im Wert des integrity
-Attributs eines <script>
-Elements oder eines <link>
-Elements mit rel="stylesheet"
, rel="preload"
, oder rel="modulepreload"
angeben.
Ein integrity
-Wert beginnt mit mindestens einem String, wobei jeder String ein Präfix enthält, das einen bestimmten Hash-Algorithmus angibt (aktuell sind die erlaubten Präfixe sha256
, sha384
und sha512
), gefolgt von einem Bindestrich, und endet mit dem tatsächlichen base64-codierten Hash.
Hinweis: Ein integrity-Wert kann mehrere durch Leerzeichen getrennte Hashes enthalten. Eine Ressource wird geladen, wenn sie mit einem dieser Hashes übereinstimmt.
Beispiel eines integrity
-Strings mit base64-codiertem sha384-Hash:
sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
Also ist oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
der "Hash"-Teil, und das Präfix sha384
zeigt an, dass es sich um einen sha384-Hash handelt.
Hinweis:
Der "Hash"-Teil eines integrity
-Werts ist genau genommen ein kryptographischer Digest, der durch das Anwenden einer bestimmten Hash-Funktion auf eine Eingabe (zum Beispiel eine Skript- oder Stylesheet-Datei) gebildet wird. Aber es ist üblich, die Abkürzung "Hash" zu verwenden, um kryptographischen Digest zu meinen, weshalb dies in diesem Artikel verwendet wird.
Tools zum Erzeugen von SRI-Hashes
SRI-Hash-Generator
Der SRI-Hash-Generator ist ein Online-Tool, das Sie verwenden können, um SRI-Hashes zu erzeugen.
Verwendung von OpenSSL
Sie können SRI-Hashes von der Befehlszeile aus mit OpenSSL erzeugen, indem Sie einen Befehl aufrufen wie:
cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A
In einer Windows-Umgebung können Sie ein Tool zum Erzeugen von SRI-Hashes erstellen, indem Sie den folgenden Code verwenden:
@echo off
set bits=384
openssl dgst -sha%bits% -binary %1% | openssl base64 -A > tmp
set /p a= < tmp
del tmp
echo sha%bits%-%a%
pause
Um diesen Code zu verwenden:
- Speichern Sie diesen Code in einer Datei mit dem Namen
sri-hash.bat
im SendTo-Ordner Ihrer Windows-Umgebung (zum BeispielC:\Users\USER\AppData\Roaming\Microsoft\Windows\SendTo
). - Klicken Sie mit der rechten Maustaste auf eine Datei im Dateiexplorer, wählen Sie Senden an…, und wählen Sie dann
sri-hash
. Sie sehen denintegrity
-Wert in einem Befehlsfenster. - Wählen Sie den
integrity
-Wert aus und klicken Sie mit der rechten Maustaste, um ihn in die Zwischenablage zu kopieren. - Drücken Sie eine beliebige Taste, um das Befehlsfenster zu schließen.
Hinweis: Wenn OpenSSL nicht auf Ihrem System installiert ist, besuchen Sie die OpenSSL-Projektwebsite für Informationen über das Herunterladen und Installieren. Das OpenSSL-Projekt hostet keine binären OpenSSL-Distributionen, pflegt aber eine informelle Liste von Drittanbieter-Distributionen: https://wiki.openssl.org/index.php/Binaries.
Verwendung von shasum
Sie können SRI-Hashes mithilfe von shasum erzeugen, indem Sie einen Befehl aufrufen wie:
shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64
- Der Schritt
xxd
nimmt die hexadezimale Ausgabe vonshasum
und konvertiert sie in Binärformat. - Der Schritt
awk
ist notwendig, weilshasum
den Dateinamen des Hashs in seiner Ausgabe anxxd
übergibt. Das kann fatale Konsequenzen haben, wenn der Dateiname zufällig gültige Hex-Zeichen enthält — weilxxd
dies ebenfalls dekodieren und anbase64
weiterleiten würde.
Cross-Origin Resource Sharing und Subresource Integrity
Für die Subresource-Integrity-Verifizierung einer Ressource, die von einem anderen Ursprung als dem des eingebetteten Dokuments bereitgestellt wird, überprüfen Browser die Ressource zusätzlich mittels Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource bereitstellt, es erlaubt, mit dem anfordernden Ursprung geteilt zu werden. Deshalb muss die Ressource mit einem Access-Control-Allow-Origin
-Header, der es erlaubt, die Ressource mit dem anfordernden Ursprung zu teilen, bereitgestellt werden; zum Beispiel:
Access-Control-Allow-Origin: *
Beispiele
In den folgenden Beispielen wird angenommen, dass oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
bereits als erwarteter SHA-384-Hash (Digest) eines bestimmten Skripts example-framework.js
bekannt ist und es eine Kopie des Skripts bei https://example.com/example-framework.js
gibt.
Subresource Integrity mit dem <script>
-Element
Sie können das folgende <script>
-Element verwenden, um einem Browser zu sagen, dass er, bevor das Skript https://example.com/example-framework.js
ausgeführt wird, das Skript zuerst mit dem erwarteten Hash vergleichen und überprüfen muss, ob es eine Übereinstimmung gibt.
<script
src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
Hinweis:
Weitere Details zum Zweck des crossorigin
-Attributs finden Sie unter CORS-Einstellungsattribute.
Wie Browser Subresource Integrity behandeln
Browser behandeln SRI, indem sie Folgendes tun:
-
Wenn ein Browser auf ein
<script>
oder<link>
-Element mit einemintegrity
-Attribut stößt, muss er, bevor das Skript ausgeführt wird oder bevor ein Stylesheet, das durch das<link>
-Element angegeben wird, angewendet wird, das Skript oder Stylesheet zuerst mit dem erwarteten Hash imintegrity
-Wert vergleichen.Für die Subresource-Integrity-Verifizierung einer Ressource, die von einem anderen Ursprung als dem des eingebetteten Dokuments bereitgestellt wird, überprüfen Browser die Ressource zusätzlich mittels Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource bereitstellt, es erlaubt, mit dem anfordernden Ursprung geteilt zu werden.
-
Wenn das Skript oder das Stylesheet nicht mit dem zugehörigen
integrity
-Wert übereinstimmt, muss der Browser sich weigern, das Skript auszuführen oder das Stylesheet anzuwenden und stattdessen einen Netzwerkfehler zurückgeben, der anzeigt, dass das Abrufen dieses Skripts oder Stylesheets fehlgeschlagen ist.
Spezifikationen
Specification |
---|
HTML # attr-link-integrity |
Subresource Integrity # the-integrity-attribute |
HTML # attr-script-integrity |