Sven Rautenberg: Wie Injections ausschließen?

Beitrag lesen

Moin!

Hauruck wäre zum Beispiel, alle $_POST/$_GET Daten zu escapen. Gleichzeitig kannst du diese Daten cleanen, also zum Beispiel per strip_tags, beugt gleichzeitig Exploits vor. Oder du nimmst per str_replace reservierte Wörter (subquery etc) aus dem Datensatz raus.

Das ist sinnloser Aktionismus, der überhaupt nicht weiterhilft.

Zum einen kann man mit vorbehandelten Eingabedaten meist nur sehr schwierig weiterarbeiten (außer natürlich an den Stellen, wo die Vorbehandlung genau richtig ist), müsste also an den entsprechenden Stellen die Vorbehandlung selektiv wieder rückgängig machen.

Zum anderen: Welche Bad-Words will man denn ausschließen? Und in welchen Kontexten würden die denn wirken, oder auch nicht? strip_tags() beispielsweise ist die gern hergenommene Schnell-Lösung für "ich will kein HTML haben", aber es ist alles andere als sicher und funktionierend. Diese Funktion hat eine lange Historie der Unzureichendheit in älteren PHP-Versionen, außerdem: Nicht alles, was böse ist, wird durch strip_tags() entfernt.

Besser ist es sicherlich, die Scripte (Queries) durchzugehen und die einzelnen $_POSTs/$_GETs entsprechend zu Casten und ggf. zu escapen - kommt der Performance zugute.

Das ist die einzige Lösung, die hilft. Sämtliche Verwendung von Eingabedaten ist nachzuvollziehen und beim Wechsel des Kontextes entsprechend zu behandeln. Eingabedaten sind dabei alle Daten, die von außen dem Skript zufließen - das ist nicht nur das Zeug in $_GPCESF, sondern auch alles, was man durch Datenbankabfragen oder Dateieinlesungen erhält. Denn auch diese Daten können zwar für SQL vollkommen harmlose Strings enthalten, aber bei Verwendung in HTML dann den Schaden anrichten.

- Sven Rautenberg