Eingabevalidierung und Injection
Jeder Wert, der von außen kommt, etwa ein Formularfeld, ein Query-String, ein Header, eine hochgeladene Datei oder eine URL, die Sie abrufen, gilt als feindlich, bis das Gegenteil bewiesen ist. Injection entsteht, wenn ein solcher Wert als Code oder Struktur statt als Daten behandelt wird.
Checkliste
- Immer parametrisierte Abfragen verwenden. Bauen Sie SQL niemals durch String-Verkettung. Verwenden Sie gebundene Parameter oder ein ORM, das die Bindung für Sie übernimmt. Damit ist SQL-Injection ausgeschlossen. Dieselbe Regel gilt für NoSQL und Shell-Befehle.
- Ausgabe kontextabhängig escapen. Verlassen Sie sich auf ein Template- oder UI-Framework, das standardmäßig escaped (React zum Beispiel). Seien Sie sehr vorsichtig bei jedem Ausweg zum Rendern von rohem HTML. Über diesen Weg gelangt Cross-Site-Scripting (XSS) ins System.
- Gegen eine Allowlist validieren, nicht gegen eine Denylist. Definieren Sie, wie ein gültiger Wert aussieht, und lehnen Sie alles andere ab, statt zu versuchen, schlechte Eingaben zu sperren.
- Serverseitige Anfragen absichern (SSRF). Ruft der Server eine vom Benutzer angegebene URL ab, validieren Sie sie und blockieren Sie interne Adressbereiche sowie die Metadatenadresse der Cloud (169.254.169.254). Verwenden Sie eine strikte Host-Validierung und fixieren Sie DNS, um DNS-Rebinding abzuwehren.
- Niemals nicht vertrauenswürdige Daten in Code deserialisieren. Vermeiden Sie pickle, native Java- oder PHP-Deserialisierung und ähnliche Verfahren für Bytes, die ein Angreifer kontrolliert. Sie führen Code aus.
- Datei-Uploads härten. Prüfen Sie den tatsächlichen Inhalt (Magic Bytes), nicht nur die Dateiendung oder den angegebenen Typ. Erzwingen Sie eine harte Größenbegrenzung. Speichern Sie Dateien außerhalb des Webroots unter einem zufälligen oder ID-basierten Namen, niemals unter dem Dateinamen des Benutzers. Liefern Sie sie mit dem korrekten Content-Type und
X-Content-Type-Options: nosniffaus. Scannen Sie nach Möglichkeit auf Malware. - Request-Bodies gegen ein Schema validieren. Lehnen Sie unbekannte Felder ab, statt sie durchzulassen (siehe Mass Assignment in APIs und Anfragen).
Testvorgehen
- Senden Sie
' OR 1=1 --,<script>alert(1)</script>und${7*7}in jedes Feld und bestätigen Sie, dass sie als wörtlicher Text gespeichert und angezeigt werden. - Richten Sie jede URL-Eingabe auf
http://169.254.169.254/und aufhttp://localhost/. - Laden Sie eine HTML-Datei hoch, die in
.pngumbenannt wurde, und bestätigen Sie, dass sie abgelehnt oder wirkungslos ausgeliefert wird.