Signatur
Beschreibung
Die Eigenschaft protocol eines URL-Objekts enthält das Schema der URL, immer in Kleinbuchstaben und mit abschließendem :, etwa "https:", "mailto:", "file:" oder "blob:". Die Eigenschaft lässt sich lesen und schreiben.
Typische Einsatzfälle: Man prüft, ob ein vom Benutzer eingegebener Link wirklich http: oder https: verwendet (Schutz vor javascript:-Links), leitet eine URL von http: auf https: oder von https: auf wss: um, oder unterscheidet Datei-, Daten- und Netzwerk-URLs.
Beim Setzen ist der Doppelpunkt optional: url.protocol = "https" und url.protocol = "https:" bewirken dasselbe. Ungültige Werte werden stillschweigend ignoriert, es gibt also keine Exception. Zwischen sogenannten speziellen Schemata (http, https, ws, wss, ftp, file) und nicht-speziellen Schemata (z. B. mailto, data, eigene Schemata) lässt sich nicht wechseln. Auch solche Zuweisungen haben keine Wirkung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | string | Nur beim Setzen: das neue Schema, mit oder ohne abschließendes :. Groß- und Kleinschreibung spielt keine Rolle, der Wert wird in Kleinbuchstaben gespeichert. |
Rückgabewert
:, z. B. "https:".Beispiele
Protokoll auslesen
const urls = [
'HTTPS://Example.org/pfad',
'mailto:info@example.org',
'file:///home/user/doc.txt',
'ws://localhost:8080/socket'
];
for (const raw of urls) {
console.log(new URL(raw).protocol);
}
Benutzer-Links auf sichere Schemata prüfen (XSS-Schutz)
const ERLAUBT = new Set(['http:', 'https:']);
const istSichererLink = (eingabe) => {
try {
return ERLAUBT.has(new URL(eingabe).protocol);
} catch {
return false; // keine gültige absolute URL
}
};
console.log(istSichererLink('https://example.org'));
console.log(istSichererLink('javascript:alert(1)'));
console.log(istSichererLink('JaVaScRiPt:alert(1)'));
console.log(istSichererLink('kein link'));
HTTP- in WebSocket-URL umwandeln
// Aus der Seiten-URL die passende WebSocket-URL ableiten
const toWebSocketUrl = (httpUrl) => {
const url = new URL('/live', httpUrl);
url.protocol = url.protocol === 'https:' ? 'wss' : 'ws';
return url.href;
};
console.log(toWebSocketUrl('https://app.example.org/dashboard'));
console.log(toWebSocketUrl('http://localhost:3000/'));
Ungültige Zuweisungen werden ignoriert
const url = new URL('https://example.org/');
url.protocol = 'mailto'; // speziell -> nicht-speziell: ignoriert
console.log(url.protocol);
url.protocol = '1abc'; // ungültiges Schema: ignoriert
console.log(url.protocol);
url.protocol = 'HTTP'; // erlaubt, wird kleingeschrieben
console.log(url.href);
// Wichtig · Fallstricke
- Doppelpunkt beachten: Vergleiche wie
url.protocol === 'https'sind immerfalse. Richtig ist'https:'. - Stilles Scheitern: Ungültige Werte und Wechsel zwischen speziellen und nicht-speziellen Schemata lösen keinen Fehler aus. Nach dem Setzen sollte man den Wert daher bei Bedarf erneut prüfen. Ein Wechsel auf
file:wird ebenfalls ignoriert, wenn die URL Zugangsdaten oder einen Port enthält. - Standardport: Wird das Protokoll gewechselt und entspricht der bisherige Port dem Standardport des neuen Schemas, entfernt der Parser den Port (z. B.
http://x:443→https://x/). - Sicherheit: Für die Prüfung von Benutzer-URLs immer über
new URL()undprotocolgehen, nicht per Regex oderstartsWith()auf dem Rohstring. Der Parser normalisiert Großschreibung und führende Leerzeichen, wodurch sich z. B." JavaScript:"sonst an einer Prüfung vorbeischmuggeln ließe. Setzen Sie ungeprüfte URLs nie inhrefodersrcein. - Kompatibilität: Wird von allen modernen Browsern unterstützt, in Node.js global ab Version 10. Gleichnamige Eigenschaften gibt es auch bei
location.protocolundHTMLAnchorElement.protocol.