Zum Skriptum

XSS – Live Demo

Formulare angreifen und absichern · Skriptum 03

Nur zu Lernzwecken – kontrollierte Lernumgebung

Was du in dieser Aufgabe uebst

XSS-Attacken verstehen

Du erkennst, wie Attacken durch HTML-Eingaben funktionieren

htmlspecialchars() einsetzen

Du kannst gefaehrliche HTML-Zeichen neutralisieren

Sicherheit im Web

Du weisst, wie man Formularfelder absichert

Was ist Cross-Site Scripting (XSS)?

XSS entsteht, wenn eine Webseite Benutzereingaben ungefiltert ausgibt. Ein Angreifer kann dann HTML- oder JavaScript-Code einschleusen, der im Browser anderer Benutzer ausgeführt wird – z. B. um Cookies zu stehlen, Formulare zu manipulieren oder Nutzer weiterzuleiten.

Das klassische Angriffsszenario: Nutzer A schreibt einen Kommentar mit schadhaftem Code. Dieser wird in der Datenbank gespeichert. Wenn Nutzer B die Seite aufruft, wird der Code im Browser von Nutzer B ausgeführt – ohne dass Nutzer B etwas ahnt.

Live-Demo: Sieh den Unterschied selbst

Schnell ausprobieren:

Unsicher – ohne Schutz
<?php
echo $_POST['kommentar'];
?>

Ausgabe im Browser:

Hallo Welt!
Sicher – mit Schutz
<?php
echo htmlspecialchars($_POST['kommentar']);
?>

Ausgabe im Browser:

Hallo Welt!

Was htmlspecialchars() im Hintergrund macht:

< → &lt; > → &gt; " → &quot; ' → &#039; & → &amp;

Tags werden als Text angezeigt, nicht als HTML interpretiert.

Aufgaben

1

Normalen Text ausprobieren

Gib Hallo Welt! ein und klicke „Abschicken". Was ist der Unterschied zwischen den beiden Ausgabe-Boxen?

2

HTML-Injektion testen

Klicke auf den Button „<b>HTML-Injektion". Was passiert in der unsicheren Box? Was in der sicheren? Erkläre den Unterschied in einem Satz.

3

Der echte Angriff

Klicke auf „💀 XSS-Angriff (alert)". Was erscheint in der unsicheren Box? Warum ist das in einer echten Webanwendung gefährlich? Beantworte: Was könnte ein Angreifer anstelle von alert() tun?

Denkanstoß: Ersetze gedanklich alert('...') durch document.cookie — damit könnte ein Angreifer den Session-Cookie des Opfers auslesen und den Login übernehmen.
4

Eigenen Payload erfinden

Schreibe selbst einen Eingabe-String mit HTML, der in der unsicheren Box visuell auffällig ist (z. B. roten Text, ein Bild, einen Button), in der sicheren Box aber harmlos als Text erscheint.

Code zum lokalen Ausprobieren

Kopiere den folgenden Code in eine neue Datei xss_test.php in deinem htdocs/-Ordner und öffne sie unter http://localhost/xss_test.php. Das Formular hat ein Textfeld und Radio-Buttons – beide Felder können unsicher ausgegeben werden.

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>XSS Test</title>
</head>
<body>

<?php
// Formular wurde abgeschickt?
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // Rohe Werte aus dem Formular lesen
    $kommentar = $_POST['kommentar'];
    $stimmung = $_POST['stimmung'];

    // ❌ UNSICHER – rohe Ausgabe ohne Escaping
    echo "<h2>Unsichere Ausgabe:</h2>";
    echo "<p>Kommentar: " . $kommentar . "</p>";
    echo "<p>Stimmung: " . $stimmung . "</p>";

    echo "<hr>";

    // ✅ SICHER – htmlspecialchars() schützt vor XSS
    echo "<h2>Sichere Ausgabe:</h2>";
    echo "<p>Kommentar: " . htmlspecialchars($kommentar) . "</p>";
    echo "<p>Stimmung: " . htmlspecialchars($stimmung) . "</p>";
}
?>

<h2>Feedback-Formular</h2>
<form method="post" action="">

    <label>Kommentar:</label><br>
    <input type="text" name="kommentar" size="50">
    <br><br>

    <label>Stimmung:</label><br>
    <input type="radio" name="stimmung" value="😊 Gut"> Gut<br>
    <input type="radio" name="stimmung" value="😐 Na ja"> Na ja<br>
    <input type="radio" name="stimmung" value="<script>alert('Radio XSS!')</script>"> ⚠️ Gefährlicher Wert<br>
    <br>

    <button type="submit">Absenden</button>
</form>

</body>
</html>

Probiere es aus

Wähle den Radio-Button „⚠️ Gefährlicher Wert" und schicke das Formular ab. Schau was in der unsicheren vs. sicheren Ausgabe passiert – und teste gleichzeitig im Textfeld den <img src=x onerror="alert('XSS!')">-Payload.

Goldene Regel der Webentwicklung

Vertraue niemals Benutzereingaben. Alles, was von außen kommt, muss vor der Ausgabe mit htmlspecialchars() escaped werden.

Übung: XSS Demo · DW2 · eduhigh.net Zurück zur Übersicht