Subresource Integrity (SRI) Implementierung
Subresource Integrity (SRI) ermöglicht es Browsern sicherzustellen, dass die von ihnen abgerufenen Ressourcen (zum Beispiel von einem CDN) ohne unerwartete Manipulationen geliefert werden. Es funktioniert, indem Sie einen kryptografischen Hash bereitstellen, den die abgerufene Ressource erfüllen muss.
Problem
Wenn ein Angreifer ein Content Delivery Network (CDN) ausnutzen und den Inhalt der auf diesem CDN gehosteten JavaScript-Bibliotheken ändern würde, würde dies Schwachstellen auf allen Websites schaffen, die diese Bibliotheken verwenden.
Zum Beispiel kann JavaScript, das auf library.org
gehostet und von example.org
geladen wird, auf die gesamten Inhalte von example.org
zugreifen. Wenn ein Angreifer dieses gehostete JavaScript so modifiziert, dass es bösartigen Code enthält, könnte es Download-Links ändern, die Seite verunstalten, Anmeldedaten stehlen, DoS-Angriffe verursachen und anderes mehr.
Lösung
Verwenden Sie SRI, um eine externe JavaScript-Ressource an ihre bekannten Inhalte zu einem bestimmten Zeitpunkt zu binden. 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 einen Hash selbst:
$ 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
: Generiert die erforderlichen<script>
-Elemente für Sie und informiert Sie, wenn das CDN keinen CORS-Support hat.