Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Wenn eingegebener Text ausgeführt wird (Injection, XSS)

Nach dieser Lektion: Ich kann erklären, wie Einschleusung und Cross-Site-Scripting funktionieren.

Lektion, 45 Min.Keine Befehle

Ein Suchfeld mit Folgen

Ein Onlineshop hat ein Suchfeld für Kundenkonten. Ein Tester tippt statt einer Adresse ein seltsames Zeichenmuster ein.

Plötzlich zeigt die Seite alle Kunden an. Das Feld hat die Eingabe nicht als Daten behandelt, sondern als Befehl.

In dieser Lektion sehen Sie, wie das passiert, und wie man es verhindert. Alles an unseren eigenen Spieldaten.

Am Ende dieser Lektion

Notiz

Ich kann erklären, wie Einschleusung und Cross-Site-Scripting funktionieren.

Schlüsselwörter

BegriffWas er bedeutet
EingabeAlles, was eine Person in ein Formular oder eine Adresszeile tippt
SQL-InjectionEingabe, die eine Datenbankabfrage verändert (deutsch: Einschleusung)
Parameterein Platzhalter in der Abfrage, der nur einen Wert aufnimmt
Cross-Site-ScriptingEingabe, die in einem fremden Browser als Programm läuft, kurz XSS
MaskierenSonderzeichen so ersetzen, dass sie nur noch Text sind (englisch: escape)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Einschleusung: Eingabe wird zum Befehl

Viele Apps bauen eine Datenbankabfrage aus einem Text zusammen. Ein Teil davon kommt aus dem Formular.

Klebt die App die Eingabe einfach hinein, kann die Eingabe die Abfrage ändern. Das nennt man SQL-Injection.

Die Datenbank kann nicht wissen, welcher Teil vom Programm kam und welcher aus dem Formular.

Probieren Sie es aus: die Abfrage, die lief

Code: sql
-- Die App sollte eine Person über die E-Mail finden.
-- Jemand hat in das Feld getippt:   ' OR '1'='1
-- Die App hat den Text in die Abfrage geklebt. Diese Abfrage lief:
SELECT name, email FROM kunden
WHERE email = '' OR '1'='1';

-- Starten Sie sie. Ändern Sie dann die WHERE-Zeile zu: WHERE email = '[email protected]';

Das Gegenmittel: Parameter

Eine parametrisierte Abfrage hat einen Platzhalter, zum Beispiel ein ?. Die Eingabe wird getrennt mitgeschickt.

So bleibt die Eingabe immer ein Wert. Sie kann nie zu SQL werden, egal was darin steht.

Merken Sie sich: Eingabe nie in einen Befehl kleben.

Probieren Sie es aus: geklebt und mit Parameter

Code: python
import sqlite3

db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE kunden (name TEXT, email TEXT)")
db.execute("INSERT INTO kunden VALUES ('Lena Hoffmann', '[email protected]')")
db.execute("INSERT INTO kunden VALUES ('Tim Berger', '[email protected]')")

getippt = "' OR '1'='1"

# Unsicher: Die Eingabe wird Teil des SQL-Textes
unsicher = "SELECT name FROM kunden WHERE email = '" + getippt + "'"
print("Zusammengeklebt:", db.execute(unsicher).fetchall())

# Sicher: Das ? ist ein Parameter, die Eingabe ist immer nur ein Wert
sicher = "SELECT name FROM kunden WHERE email = ?"
print("Parameter:", db.execute(sicher, [getippt]).fetchall())

# Ändern Sie getippt zu "[email protected]" und starten Sie erneut.

Ein häufiger Fehler

Warnung

Viele glauben, man müsse nur Anführungszeichen aus der Eingabe löschen. Angreifende finden andere Zeichen und Umwege an so einem Filter vorbei. Nutzen Sie jedes Mal Parameter, wenn Eingabe in eine Abfrage geht, denn dann kann Eingabe nie zu SQL werden.

Cross-Site-Scripting: Eingabe läuft im Browser

Eine Produktseite zeigt Kundenbewertungen an. Die App setzt den Text einer Bewertung direkt in die Seite.

Steht darin etwas, das wie HTML oder ein Skript aussieht, führt der Browser jedes Besuchers es aus. Das ist Cross-Site-Scripting, kurz XSS.

Der Angriff läuft also nicht auf dem Server, sondern im Browser der Besucher.

Probieren Sie es aus: eine Bewertung maskieren

Code: python
def maskiere(text):
    # Das & muss zuerst ersetzt werden, sonst wird unser eigenes Ergebnis noch einmal verändert
    text = text.replace("&", "&")
    text = text.replace("<", "&lt;")
    text = text.replace(">", "&gt;")
    return text


bewertung = "Toll! <b>Jetzt kaufen</b>"
print("Ohne Schutz:", "<p>" + bewertung + "</p>")
print("Mit Schutz: ", "<p>" + maskiere(bewertung) + "</p>")

# Der Browser zeigt die zweite Zeile als Text. Die erste bekäme fettgedruckte Schrift.

Die beiden Angriffe im Vergleich

Einschleusung (SQL)Cross-Site-Scripting
Wo landet die Eingabe?In einer DatenbankabfrageIn einer Webseite
Wo wirkt es?Auf dem ServerIm Browser der Besucher
GegenmittelParameterMaskieren

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Im Berufsalltag

Tipp

Bei der Prüfung neuen Codes gilt eine einfache Frage: Wo kommt Eingabe herein, und wo landet sie? Wer das bei jeder Änderung fragt, fällt in einem Team positiv auf. In echtem Code nehmen Sie die fertige Maskierung Ihres Frameworks. Sie kennt auch Anführungszeichen.

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.