Web-Sicherheit: Vertraue keiner Nutzereingabe
Injection, XSS und CSRF sind drei Versionen eines Fehlers: etwas Getipptes wie einen Befehl zu behandeln.
Jede Web-Schwachstelle, die dir auf diesem Niveau begegnet, ist eine gebrochene Regel: Vertraue keiner Eingabe, die von außerhalb deines Programms kommt. Dein Browser, dein Formular, deine API und dein Cookie sind alle außen. Die Eingabe ist nicht "böse" — sie ist völlig gültiger Text. Der Fehler ist, dass dein Programm aufgehört hat, sie als Daten zu behandeln, und sie Teil eines Befehls, einer Abfrage, einer Seite oder einer Anfrage werden ließ.
the page builds a greeting from the name you typed
name you typed: Ada
page shows: Hello, Ada
name you typed: <script>...</script>
page shows: the browser obeys the script instead of printing it
cause: the server put your text into the page without escaping itDer Nutzer hat Text getippt. Die Seite hat entschieden, dass es Auszeichnungssprache ist. Der Browser konnte den Unterschied nicht erkennen.SQL-Injection ist derselbe Fehler eine Ebene tiefer. Wenn Code Nutzertext in einen SQL-String klebt, hört ein Wert wie eine E-Mail-Adresse auf, ein Wert zu sein, und wird Teil der Grammatik der Abfrage. Das klassische Beispiel ist ein Login-Formular, in dem der Text nach einem Anführungszeichen den Rest der Abfrage zum Kommentar macht. Die Verteidigung ist nicht, nach Anführungszeichen zu suchen: Man verwendet Parameter, damit die Datenbank die Struktur der Abfrage und die Werte getrennt erhält und nie raten muss, was was ist.
SELECT id, email FROM users
WHERE email = 'student@example.org' AND password_hash = '...';
-- the same query, built by gluing user input into the text:
-- 1 OR 1=1 --
-- the condition stops being a condition and becomes a statementEin in den Abfragetext geklebter Wert wird Abfragetext. Ein Parameter bleibt ein Wert, egal wie seltsam er aussieht.Praxis
Ein Login-Formular baut seine Abfrage durch Aneinanderkleben von Text. Welche Änderung beseitigt die SQL-Injection wirklich?
Hinweise
- Finde die Stelle, an der der Text aufhört, Daten zu sein, und Teil des Befehls wird.
- Anführungszeichen sind kein Parameter: Das eine ist Satzzeichen, das andere ein Wert, den die Datenbank getrennt hält.
15 XP
Ordne jedem Angriff den Teil des Systems zu, der den Text des Angreifers ausführt.
Hinweise
- Frag, welches Programm den Text des Angreifers am Ende ausführt: die Datenbank, der Browser oder die Shell.
- Die Lösung ist immer dieselbe Idee, aber die Stelle, an der man sie anwendet, unterscheidet sich.
15 XP
Schreibe isSafeNickname(name), das nur Buchstaben, Ziffern und Unterstriche akzeptiert, 3 bis 16 Zeichen. Diese Prüfung mag keine Blocklisten: Beschreibe, was erlaubt ist, statt was verboten ist.
Hinweise
- Eine Allowlist prüft gegen die Werte, die du annimmst; eine Blocklist entfernt nur die Werte, die dir eingefallen sind.
- Die Länge ist eine billige Prüfung, die riesige Nutzlasten stoppt, bevor irgendetwas anderes läuft.
18 XP