Subresource Integrity
Subresource Integrity (SRI) ist ein Sicherheitsfeature, das es Browsern ermöglicht zu überprüfen, ob die von ihnen abgerufenen Ressourcen (zum Beispiel von einem CDN) ohne unerwartete Veränderungen geliefert werden. Es funktioniert, indem Sie einen kryptographischen Hash angeben, den eine abgerufene Ressource erfüllen muss.
Hinweis: Für die Subresource-Integrity-Überprüfung 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, diese mit dem anfordernden Ursprung zu teilen.
Wie Subresource Integrity hilft
Websites entscheiden sich manchmal dafür, sich auf einen Drittanbieter wie ein Content Delivery Network (CDN) zu stützen, um einige ihrer Ressourcen zu hosten, anstatt alle ihre Ressourcen selbst zu hosten. Beispielsweise könnte ein Dokument, das von https://example.com
bereitgestellt wird, eine Ressource von einer anderen Quelle enthalten:
<script src="https://not-example.com/script.js"></script>
Dies birgt das Risiko, dass, wenn ein Angreifer die Kontrolle über den Drittanbieter-Host erlangt, der Angreifer beliebige bösartige Inhalte in seine Dateien injizieren (oder die Dateien komplett ersetzen) kann und dadurch potenziell auch Websites attackieren kann, die Dateien von ihm abrufen.
Subresource Integrity ermöglicht es Ihnen, einige Risiken solcher Angriffe 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 injiziert hat – und ohne dass irgendwelche anderen Änderungen an diesen Dateien vorgenommen wurden – bereitgestellt werden.
Verwendung von Subresource Integrity
Sie verwenden das Subresource Integrity-Feature, indem Sie einen base64-kodierten kryptographischen Hash einer Ressource (Datei) angeben, die Sie dem Browser zum Abrufen anweisen, indem Sie den Hash im Wert des integrity
-Attributs eines <script>
-Elements oder eines <link>
-Elements mit rel="stylesheet"
, rel="preload"
oder rel="modulepreload"
festlegen.
Ein integrity
-Wert beginnt mit mindestens einem String, wobei jeder String ein Präfix enthält, das einen bestimmten Hash-Algorithmus angibt (derzeit sind die erlaubten Präfixe sha256
, sha384
und sha512
), gefolgt von einem Bindestrich und endet mit dem tatsächlichen base64-kodierten Hash.
Hinweis: Ein integrity-Wert kann mehrere durch Leerzeichen getrennte Hashes enthalten. Eine Ressource wird geladen, wenn sie mit einem dieser Hashes übereinstimmt.
Beispiel für einen integrity
-String mit base64-kodiertem sha384-Hash:
sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
Also ist oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
der "Hash"-Teil, und das Präfix sha384
gibt an, dass es sich um einen sha384-Hash handelt.
Hinweis:
Der "Hash"-Teil eines integrity
-Wertes ist streng genommen ein kryptographischer Digest, der durch Anwenden einer bestimmten Hash-Funktion auf bestimmte Eingaben (z. B. eine Skript- oder Stylesheet-Datei) gebildet wird. Aber es ist üblich, die Abkürzung "Hash" zu verwenden, um kryptographischer Digest zu bedeuten, daher wird dies in diesem Artikel verwendet.
Werkzeuge zur Erstellung von SRI-Hashes
SRI Hash Generator
Der SRI Hash Generator ist ein Online-Tool, mit dem Sie SRI-Hashes generieren können.
Verwendung von OpenSSL
Sie können SRI-Hashes mithilfe der OpenSSL-Kommandozeile mit folgendem Befehl erstellen:
cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A
In einer Windows-Umgebung können Sie mit dem folgenden Code ein Tool zur Generierung von SRI-Hashes erstellen:
@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 namens
sri-hash.bat
im Windows-Ordner SendTo in Ihrer Umgebung (zum BeispielC:\Users\USER\AppData\Roaming\Microsoft\Windows\SendTo
). - Klicken Sie mit der rechten Maustaste auf eine Datei im Datei-Explorer, wählen Sie Senden an…, und wählen Sie dann
sri-hash
. Sie sehen den Integrity-Wert in einem Befehlsfeld. - 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 Befehlsfeld zu schließen.
Hinweis: Wenn OpenSSL auf Ihrem System nicht installiert ist, besuchen Sie die OpenSSL-Projekt-Website für Informationen über das Herunterladen und Installieren. Das OpenSSL-Projekt hostet selbst keine Binärverteilungen von OpenSSL, pflegt jedoch eine informelle Liste von Drittanbieter-Distributionen: https://github.com/openssl/openssl/wiki/Binaries.
Verwendung von shasum
Sie können SRI-Hashes mit shasum mit einem Befehl wie diesem generieren:
shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64
- Der Pipe-Durchlauf
xxd
Schritt nimmt die hexadezimalen Ausgaben vonshasum
und konvertiert sie in Binärformat. - Der Pipe-Durchlauf
awk
Schritt ist notwendig, weilshasum
den gehashten Dateinamen in seiner Ausgabe anxxd
weitergibt. Das kann katastrophale Folgen haben, wenn der Dateiname zufällig gültige Hex-Zeichen enthält – weilxxd
das ebenfalls dekodieren und anbase64
weitergeben würde.
Cross-Origin Resource Sharing und Subresource Integrity
Für die Subresource-Integrity-Überprüfung 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, diese mit dem anfordernden Ursprung zu teilen. Daher muss die Ressource mit einem Access-Control-Allow-Origin
-Header bereitgestellt werden, der es erlaubt, die Ressource mit dem anfordernden Ursprung zu teilen; zum Beispiel:
Access-Control-Allow-Origin: *
Beispiele
In den folgenden Beispielen gehen wir davon aus, dass oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
bereits als erwarteter SHA-384-Hash (Digest) eines bestimmten Scripts example-framework.js
bekannt ist und eine Kopie des Scripts unter https://example.com/example-framework.js
gehostet wird.
Subresource Integrity mit dem <script>
-Element
Sie können das folgende <script>
-Element verwenden, um einem Browser mitzuteilen, dass er, bevor er das Script https://example.com/example-framework.js
ausführt, zuerst das Script mit dem erwarteten Hash vergleichen und sicherstellen muss, dass eine Übereinstimmung vorliegt.
<script
src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
Hinweis:
Für weitere Details zum Zweck des crossorigin
-Attributs siehe CORS-Einstellungen-Attribute.
Wie Browser mit Subresource Integrity umgehen
Browser verarbeiten SRI, indem sie Folgendes tun:
-
Wenn ein Browser ein
<script>
- oder<link>
-Element mit einemintegrity
-Attribut trifft, muss er, bevor er das Script ausführt oder bevor er ein durch das<link>
-Element spezifiziertes Stylesheet anwendet, zuerst das Script oder Stylesheet mit dem erwarteten Hash vergleichen, der imintegrity
-Wert angegeben wird.Für die Subresource-Integrity-Überprüfung 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, diese mit dem anfordernden Ursprung zu teilen.
-
Wenn das Script oder Stylesheet nicht mit dem zugehörigen
integrity
-Wert übereinstimmt, muss der Browser sich weigern, das Script auszuführen oder das Stylesheet anzuwenden und stattdessen einen Netzwerkfehler zurückgeben, der anzeigt, dass das Abrufen dieses Scripts oder Stylesheets fehlgeschlagen ist.
Spezifikationen
Specification |
---|
HTML # attr-link-integrity |
Subresource Integrity # the-integrity-attribute |
HTML # attr-script-integrity |