Signatur
Beschreibung
Die Methode isScriptURL() gehört zur TrustedTypePolicyFactory, die global über window.trustedTypes (bzw. self.trustedTypes in Workern) erreichbar ist. Sie gibt true zurück, wenn der übergebene Wert ein gültiges TrustedScriptURL-Objekt ist, also über policy.createScriptURL() einer registrierten Policy entstanden ist.
Gebraucht wird sie vor allem in Bibliotheken und Hilfsfunktionen, die Skript-URLs annehmen, etwa für script.src, new Worker() oder importScripts(). Damit lässt sich unterscheiden, ob ein Wert schon geprüft ist oder erst noch durch eine Policy laufen muss, bevor er einer sogenannten Injection Sink zugewiesen wird.
Wichtig: Die Prüfung schaut auf die interne Markierung des Objekts, nicht auf dessen Inhalt oder Prototyp. Ein normaler String mit einer URL, ein nachgebautes Objekt mit passender toString()-Methode oder ein TrustedHTML-Objekt ergibt immer false. Ein TrustedScriptURL aus einem anderen Realm (z. B. aus einem iframe) erkennt die Methode dagegen korrekt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | any | Der zu prüfende Wert. Jeder Typ ist erlaubt; nur echte TrustedScriptURL-Instanzen ergeben true. |
Rückgabewert
true, wenn value ein gültiges TrustedScriptURL-Objekt ist, sonst false.Beispiele
Grundlegende Prüfung
const policy = trustedTypes.createPolicy('script-urls', {
createScriptURL: (url) => {
const parsed = new URL(url, location.href);
if (parsed.origin !== location.origin) {
throw new TypeError(`Fremde Skript-URL blockiert: ${url}`);
}
return parsed.href;
}
});
const trusted = policy.createScriptURL('/js/app.js');
const plain = '/js/app.js';
console.log(trustedTypes.isScriptURL(trusted));
console.log(trustedTypes.isScriptURL(plain));
Gefälschte Objekte und falsche Trusted-Typen erkennen
const policy = trustedTypes.createPolicy('demo', {
createHTML: (s) => s,
createScriptURL: (s) => s
});
const fake = { toString: () => '/js/evil.js' };
const html = policy.createHTML('<b>Hallo</b>');
console.log(trustedTypes.isScriptURL(fake)); // nachgebautes Objekt
console.log(trustedTypes.isScriptURL(html)); // TrustedHTML, nicht ScriptURL
console.log(trustedTypes.isScriptURL(policy.createScriptURL('/js/ok.js')));
Hilfsfunktion zum sicheren Laden von Skripten
const scriptPolicy = trustedTypes.createPolicy('loader', {
createScriptURL: (url) => {
const u = new URL(url, location.href);
const erlaubt = [location.origin, 'https://cdn.example.com'];
if (!erlaubt.includes(u.origin)) {
throw new TypeError(`Nicht erlaubt: ${u.origin}`);
}
return u.href;
}
});
const loadScript = (src) => new Promise((resolve, reject) => {
// Nur ungeprüfte Werte durch die Policy schicken
const safeSrc = trustedTypes.isScriptURL(src)
? src
: scriptPolicy.createScriptURL(src);
const script = document.createElement('script');
script.src = safeSrc;
script.onload = resolve;
script.onerror = () => reject(new Error(`Laden fehlgeschlagen: ${src}`));
document.head.append(script);
});
await loadScript('https://cdn.example.com/lib.js');
console.log('Bibliothek geladen');
Feature-Erkennung mit Fallback
const isTrustedScriptURL = (value) =>
typeof trustedTypes !== 'undefined' && trustedTypes.isScriptURL(value);
console.log(isTrustedScriptURL('/js/app.js'));
// Wichtig · Fallstricke
- Browser-Unterstützung: Chromium-Browser (Chrome, Edge, Opera) unterstützen Trusted Types seit Version 83. Firefox und Safari haben die API erst vor Kurzem eingeführt. Ohne Unterstützung ist
window.trustedTypesundefined, deshalb vorher auf Verfügbarkeit prüfen oder ein Polyfill wietrusted-typesvon W3C/Google nutzen. - Die Methode prüft nicht, ob die URL tatsächlich sicher ist. Sie bestätigt nur, dass der Wert durch eine Policy gelaufen ist. Die Sicherheit hängt also ganz von der Logik in
createScriptURLab. Eine Policy, die Eingaben ungeprüft weiterreicht, macht den Schutz wirkungslos. - Unterschiedliche Trusted-Typen sind nicht austauschbar: Für ein
TrustedHTMLoderTrustedScriptliefertisScriptURL()false. Dafür gibt esisHTML()undisScript(). - Die Prüfung allein erzwingt nichts. Durchgesetzt wird der Schutz erst durch den CSP-Header
Content-Security-Policy: require-trusted-types-for 'script'. Dann führt die Zuweisung eines normalen Strings anscript.srczu einemTypeError, sofern keine Standard-Policy (default) greift. - Die Methode ist auch in Web Workern über
self.trustedTypesverfügbar.