Implementierung von Subresource Integrity (SRI)
Subresource Integrity (SRI) ermöglicht es Browsern zu überprüfen, dass die geladenen Ressourcen (zum Beispiel von einem CDN) ohne unerwartete Manipulation geliefert werden. Dies funktioniert, indem Sie einen kryptografischen Hash bereitstellen, mit dem die geladene Ressource übereinstimmen muss.
Problem
Wenn ein Angreifer ein Content Delivery Network (CDN) ausnutzt und den Inhalt von JavaScript-Bibliotheken, die auf diesem CDN gehostet werden, verändert, würde dies Schwachstellen auf allen Websites schaffen, die diese Bibliotheken verwenden.
Zum Beispiel kann auf library.org
gehostetes JavaScript, das von example.org
geladen wird, auf den gesamten Inhalt von example.org
zugreifen. Wenn ein Angreifer dieses gehostete JavaScript ändert, um bösartigen Code einzufügen, könnte es Download-Links verändern, die Website verunstalten, Anmeldedaten stehlen, Denial-of-Service (DoS)-Angriffe verursachen und so weiter.
Lösung
Verwenden Sie SRI, um eine externe JavaScript-Ressource auf deren bekannten Inhalt zu einem bestimmten Zeitpunkt festzulegen. Dies wird durch einen base64-kodierten kryptografischen Hash verifiziert. Geben Sie diesen Hash im integrity
-Attribut an, wenn Sie die Ressource laden.
Wenn die Datei nach diesem Zeitpunkt geändert wird, stimmt der Hash nicht mehr überein und unterstützende Webbrowser werden sich weigern, sie zu laden.
SRI sollte beim Laden externer JavaScript- oder Stylesheet-Ressourcen verwendet werden. Die Ressourcen sollten über HTTPS geladen werden.
Beachten Sie, dass CDNs Cross-Origin Resource Sharing (CORS) verwenden müssen, indem sie den Access-Control-Allow-Origin
Header setzen.
Beispiele
Laden Sie jQuery 2.1.4 von seinem CDN:
<script
src="https://code.jquery.com/jquery-2.1.4.min.js"
integrity="sha384-R4/ztc4ZlRqWjqIuvf6RX5yb/v90qNGx6fS48N0tRxiGkqveZETq72KgDVJCp2TC"
crossorigin="anonymous"></script>
Laden Sie AngularJS 1.4.8 von seinem CDN:
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"
integrity="sha384-r1y8TJcloKTvouxnYsi4PJAx+nHNr90ibsEn3zznzDzWBN9X3o3kbHLSgcIPtzAp"
crossorigin="anonymous"></script>
Generieren Sie selbst einen Hash:
$ curl -s https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js | \
openssl dgst -sha384 -binary | \
openssl base64 -A
r1y8TJcloKTvouxnYsi4PJAx+nHNr90ibsEn3zznzDzWBN9X3o3kbHLSgcIPtzAp
Siehe auch
<link>
<script>
- SRI Hash Generator auf
srihash.org
: Erzeugt die erforderlichen<script>
-Elemente für Sie und informiert Sie darüber, ob das CDN kein CORS unterstützt.