Start · Sprachen · JavaScript · Referenz · Request.integrity

Request.integrity

Eigenschaft

Schreibgeschützte Eigenschaft, die den Subresource-Integrity-Wert (z. B. <code>sha384-…</code>) einer <code>Request</code> als String liefert.

seit JavaScript Baseline: alle modernen Browser (Chrome 46+, Firef Kategorie: webapi

Signatur

get Request.integrity

Beschreibung

Die Eigenschaft Request.integrity gibt die Metadaten für Subresource Integrity (SRI) zurück, die beim Erzeugen der Anfrage über die Option integrity im RequestInit-Objekt gesetzt wurden. Der Wert besteht aus einem oder mehreren durch Leerzeichen getrennten Einträgen der Form <algorithmus>-<base64-hash>, etwa sha256-…, sha384-… oder sha512-….

Mit einem gesetzten Integrity-Wert prüft der Browser nach dem Laden, ob der Hash des Antwortkörpers übereinstimmt. Weicht er ab, wird das Promise von fetch() mit einem TypeError abgelehnt – manipulierte oder unerwartet geänderte Ressourcen (etwa von einem CDN) werden so gar nicht erst verarbeitet.

Die Eigenschaft ist nur lesbar. Wurde kein Wert angegeben, ist sie ein leerer String "". Praktisch nutzt man sie vor allem in Service Workern, Logging- oder Proxy-Code, wenn man eingehende Anfragen untersuchen oder unverändert weiterreichen will.

Rückgabewert

Typ
string
Beschreibung
Der SRI-Wert der Anfrage, z. B. "sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC", oder "", wenn keiner gesetzt wurde.

Beispiele

Integrity-Wert setzen und auslesen

const req = new Request('https://cdn.example.com/lib.js', {
  integrity: 'sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC'
});

console.log(req.integrity);

// Ohne Option: leerer String
console.log(new Request('/api/data').integrity === '');
sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC true

Fehlgeschlagene Integritätsprüfung abfangen

const loadVerified = async (url, hash) => {
  const req = new Request(url, { integrity: hash });
  try {
    const res = await fetch(req);
    return await res.text();
  } catch (err) {
    // Hash passt nicht oder Netzwerkfehler
    console.error(`Integritätsprüfung fehlgeschlagen (${req.integrity}):`, err.name);
    return null;
  }
};

loadVerified('https://cdn.example.com/lib.js', 'sha256-FALSCHERHASH=');
Integritätsprüfung fehlgeschlagen (sha256-FALSCHERHASH=): TypeError

Service Worker: Anfragen mit SRI protokollieren

self.addEventListener('fetch', (event) => {
  const { request } = event;
  if (request.integrity) {
    console.log(`SRI-geschützt: ${request.url} → ${request.integrity}`);
  }
  // Request-Objekt unverändert weitergeben, damit integrity erhalten bleibt
  event.respondWith(fetch(request));
});

SRI-Hash selbst berechnen (Web Crypto)

const sriHash = async (text) => {
  const data = new TextEncoder().encode(text);
  const digest = await crypto.subtle.digest('SHA-384', data);
  const b64 = btoa(String.fromCharCode(...new Uint8Array(digest)));
  return `sha384-${b64}`;
};

const hash = await sriHash('console.log("hi");');
const req = new Request('/scripts/hi.js', { integrity: hash });
console.log(req.integrity.startsWith('sha384-'));
true

// Wichtig · Fallstricke

  • Schreibgeschützt: req.integrity = '…' hat keine Wirkung (im Strict Mode TypeError). Zum Ändern mit new Request(req, { integrity: '…' }) eine neue Anfrage erzeugen.
  • CORS erforderlich: Bei Cross-Origin-Anfragen muss der Server CORS-Header senden. Im Modus no-cors ist die Antwort opak, und eine SRI-Prüfung schlägt immer fehl.
  • Fehlerbild: Eine fehlgeschlagene Prüfung wirft einen allgemeinen TypeError, der sich nicht von Netzwerkfehlern unterscheiden lässt. Details stehen nur in der Entwicklerkonsole.
  • Unterstützte Algorithmen: sha256, sha384, sha512. Bei mehreren Einträgen gewinnt der stärkste Algorithmus. Unbekannte Algorithmen werden ignoriert.
  • Ändert sich die Ressource (z. B. bei einem CDN-Update ohne feste Version), schlägt die Anfrage fehl. Deshalb immer versionierte URLs verwenden.
  • Kompatibilität: in allen modernen Browsern verfügbar, in Node.js ab Version 18 (undici). Der Internet Explorer unterstützt die Eigenschaft nicht.