0 Tage Serie
javascript / intermediate
Snippet

Validierung dynamischer Link-URLs zur Verhinderung von JavaScript-Pseudoprotokoll-Injektionen

Die ungeprüfte Übergabe dynamischer Benutzereingaben an ein `href`-Attribut ermöglicht Angreifern die Ausführung von `javascript:...`-Pseudoprotokollen. Durch die Validierung mit der nativen `URL`-API werden nur sichere Protokolle zugelassen, während `rel="noopener noreferrer"` vor Tabnabbing schützt.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import React from 'react';
const ALLOWED_PROTOCOLS = ['https:', 'http:', 'mailto:'];
export function SafeExternalLink({ href, children, ...rest }) {
const isSafeProtocol = (targetUrl) => {
try {
const parsed = new URL(targetUrl, window.location.origin);
return ALLOWED_PROTOCOLS.includes(parsed.protocol);
}
catch {
return false;
}
};
const safeHref = isSafeProtocol(href) ? href : '#';
return (
<a
href={safeHref}
target="_blank"
rel="noopener noreferrer"
{...rest}
>
{children}
</a>
);
}
react
Erklärung
1
const parsed = new URL(targetUrl, window.location.origin);
Parst den Eingabestring mit dem standardisierten URL-Konstruktor des Browsers zur Protokollprüfung.
2
return ALLOWED_PROTOCOLS.includes(parsed.protocol);
Prüft das Schema der URL gegen eine Whitelist, um unsichere Schemata wie javascript: abzuweisen.
3
rel="noopener noreferrer"
Verhindert den Zugriff der Zielseite auf window.opener und unterdrückt Referrer-Header.