So erzeugen Sie einen SRI-Hash
- Der Modus SRI ist ausgewählt. Unter Hashes wählen Sie sha256, sha384 und/oder sha512; sha384 ist standardmäßig ausgewählt.
- Legen Sie die
.js- oder.css-Dateien ab, während Eingabe auf Datei steht. Der Tag-Typ richtet sich nach der Dateiendung. - Oder fügen Sie mit Eingabe auf Text den Inhalt der Datei in Dateiinhalt (einfügen) ein, wählen den Tag (
<script>oder<link rel="stylesheet">) und geben unter Pfad den Pfad oder die URL ein, unter der die Datei ausgeliefert wird. - Kopieren Sie den Wert
integrityoder das ganze HTML-Tag. Mehrere gewählte Algorithmen erscheinen durch Leerzeichen getrennt in einem Attribut.
Eine Datei abzulegen ist zuverlässiger als Einfügen. Ein Textfeld im Browser wandelt CRLF-Zeilenenden in LF um, und ein fehlender oder zusätzlicher letzter Zeilenumbruch ändert den Hash; das Tool weist Sie auf beides hin.
Was der integrity-Wert ist
Ein SRI-Wert besteht aus dem Namen des Algorithmus, einem Bindestrich und dem Base64-Digest der exakten Bytes der Datei. Für eine Datei app.js mit einer Zeile console.log('hello'); und einem Zeilenumbruch danach:
<script src="https://cdn.example.com/app.js"
integrity="sha384-eEqgsNuDqSzbarn2kIY7c4WH6zkoJrjJRQIhlYgVwRR+6Eb8tkfTItTNLlIjbE3O"
crossorigin="anonymous"></script>
Ohne den letzten Zeilenumbruch ergibt dieselbe Zeile den Hash sha384-v393mDht/MNBowq0Z9UpetDvKE6u6EdCihklP1GZs66vL1YCFm1Z4Q4wJtb94rY9. Der Browser lädt die Datei herunter, hasht den empfangenen Body (nachdem er die gzip- oder Brotli-Transportkompression entfernt hat, Kompression spielt also keine Rolle) und weigert sich, die Datei auszuführen oder anzuwenden, wenn keiner der aufgeführten Hashes passt.
Wann sich SRI lohnt
SRI schützt Sie, wenn jemand anderes Ihren Code ausliefert: ein öffentliches CDN, ein Drittanbieter-Host für Widgets, ein Storage-Bucket, den Sie mit anderen Teams teilen. Wird dieser Server kompromittiert und die Datei ersetzt, blockieren Browser die veränderte Datei, statt sie auf Ihren Seiten auszuführen.
Es passt zu Dateien, die sich unter einer bestimmten URL nie ändern, etwa library@1.2.3/dist/lib.min.js. Es passt nicht zu:
- URLs wie
/latest/oder@1, die auf neue Releases weiterwandern. - Antworten, die je nach Browser oder Region unterschiedlich ausfallen, etwa manches Webfont-CSS, das je nach User-Agent andere
@font-face-Regeln ausliefert. - Skripten, die der Anbieter absichtlich an Ort und Stelle aktualisiert, etwa viele Analytics- und Chat-Loader. Dort müssen Sie sich zwischen SRI und den Updates des Anbieters entscheiden.
Für Ihre eigenen Dateien auf Ihrer eigenen Domain bringt SRI wenig: Wer die Datei ändern kann, kann meist auch das HTML ändern. Dort ist eine Content Security Policy das bessere Werkzeug; der CSP-Nonce-Generator und CSP-Hashes aus SHA-256 in Base64 decken diese Seite ab.
CORS und das Attribut crossorigin
Eine Datei von einem anderen Origin mit einem integrity-Attribut muss im CORS-Modus abgerufen werden, und der Server muss das mit Access-Control-Allow-Origin erlauben (bei öffentlichen CDNs meist *). Genau das fordert crossorigin="anonymous" an; das erzeugte Tag enthält es immer. Ohne CORS kann der Browser die Bytes nicht lesen, um sie zu hashen, und blockiert die Datei mit einer Konsolenmeldung, die den Integrity- oder CORS-Fehler nennt.
Dateien vom selben Origin brauchen das Attribut nicht, es schadet aber auch nicht.
SRI-Hashes im Build erzeugen
Bei mehr als ein paar Dateien berechnen Sie die Hashes in Ihrem Build-Schritt:
openssl dgst -sha384 -binary app.js | openssl base64 -A
const crypto = require("crypto");
const fs = require("fs");
const integrity = "sha384-" +
crypto.createHash("sha384").update(fs.readFileSync("app.js")).digest("base64");
console.log(integrity);
Beide geben für die Beispieldatei den obigen Wert eEqgsNuD… aus. Bundler haben oft ein Plugin, das das Attribut für Sie ins HTML schreibt und die Hashes so mit jedem Build synchron hält. Um einen erhaltenen Wert zu prüfen, legen Sie die Datei hier ab und vergleichen; der Vergleich ist exakt, Zeichen für Zeichen.
Häufige Fragen
Welchen Algorithmus sollte ich für SRI verwenden?
SHA-384 ist die übliche Wahl und der Algorithmus, den CDNs meist veröffentlichen. Browser akzeptieren sha256, sha384 und sha512; stehen mehrere im Attribut, verwenden sie den stärksten vorhandenen und ignorieren die schwächeren.
Warum blockiert der Browser mein Skript, nachdem ich integrity hinzugefügt habe?
Entweder unterscheiden sich die Bytes von denen, die Sie gehasht haben, oder die Datei kommt von einem anderen Origin ohne CORS. Prüfen Sie die Meldung in der Konsole, vergleichen Sie mit der Datei, die der Server tatsächlich ausliefert, und stellen Sie sicher, dass die Antwort Access-Control-Allow-Origin enthält und das Tag crossorigin="anonymous" hat.
Kann ich SRI mit einer Datei verwenden, die sich ändert, etwa einer „latest“-URL?
Nein. Der Hash legt genau eine Version fest, jedes Update bricht die Seite also, bis Sie den Hash anpassen. Verlinken Sie eine versionierte URL, oder listen Sie während eines Rollouts den alten und den neuen Hash nebeneinander auf.
Wie erzeuge ich einen SRI-Hash auf der Kommandozeile?
Führen Sie openssl dgst -sha384 -binary app.js | openssl base64 -A aus und setzen Sie sha384- vor das Ergebnis. Lassen Sie -binary stehen: Ohne das Flag würden Sie den Hex-Text kodieren.