Wie Injections ausschließen?
Sebastian
- datenbank
Hi,
Ich hab vor Jahren eine php/mysql-Anwendung geschrieben. Die soll demnächst wieder aktiviert werden. Da ich damals nicht groß auf Sicherheit geachtet habe, die Anwendung aber relativ groß ist, frage ich mich, wie ich auf möglichst einfache und schnelle Weise Injections ausschließen kann.
Alle Scripte durchgehen und Statement für Statement abklappern?
Oder lokal ausführen und mir jede ensprechende URL im Browser raussuchen und dann gezielt im Script entsprechend escapen? Oder gibt es Tools oder irgendeinen Hauruck-Workaround? ich habe die Anwendung übrigens seinerzeit dann doch schon auf PHP5 entwickelt, glücklicherweise.
Danke für Tips.
Basti
Injections verhindern: alle clientseitigen Eingaben auf Länge und Plausibilität prüfen, ggf. gefährliche Zeichen entsprechend maskieren.
Gruß, LX
Injections verhindern: alle clientseitigen Eingaben auf Länge und Plausibilität prüfen, ggf. gefährliche Zeichen entsprechend maskieren.
Gruß, LX
Richtig. Das heisst intval() auf alles anwenden was integer sein soll, quotes bei Strings benutzen, trim_tags() mit entsprechender whitelist wenn Du html quellcode abspeichern willst/musst, is_integer(), is_boolean()... also prinzipiell von allen Daten denken, dass sie böse sind.
Gruß
Chris
Hi,
Ich hab vor Jahren eine php/mysql-Anwendung geschrieben. Die soll demnächst wieder aktiviert werden. Da ich damals nicht groß auf Sicherheit geachtet habe, die Anwendung aber relativ groß ist, frage ich mich, wie ich auf möglichst einfache und schnelle Weise Injections ausschließen kann.
Alle Scripte durchgehen und Statement für Statement abklappern?
Oder lokal ausführen und mir jede ensprechende URL im Browser raussuchen und dann gezielt im Script entsprechend escapen? Oder gibt es Tools oder irgendeinen Hauruck-Workaround? ich habe die Anwendung übrigens seinerzeit dann doch schon auf PHP5 entwickelt, glücklicherweise.Danke für Tips.
Basti
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.
Besser ist es sicherlich, die Scripte (Queries) durchzugehen und die einzelnen $_POSTs/$_GETs entsprechend zu Casten und ggf. zu escapen - kommt der Performance zugute.
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
Hi!
Ich hab vor Jahren eine php/mysql-Anwendung geschrieben. Die soll demnächst wieder aktiviert werden. Da ich damals nicht groß auf Sicherheit geachtet habe, die Anwendung aber relativ groß ist, frage ich mich, wie ich auf möglichst einfache und schnelle Weise Injections ausschließen kann.
Dann hast du vermutlich nicht nur Lücken beim Datenbankhandling sondern generell das Thema kontextgeechte Behandlung nicht beachtet. Auch beim Einfügen in den HTML-Kontext müssen Sonderzeichen beachtet werden. Ebenso sind URLs ein eigener Kontext genauso wie Javascript auch einer ist.
Für Strings, die in MySQL-Statements eingefügt werden sollen, gibt es die Funktion mysql_real_escape_string() oder mysqli_real_escape_string(). Wenn du die Werte damit behandelst, musst du sicherstellen, dass das Feature Magic Quotes ausgeschaltet ist oder seine Auswirkungen rückgängig machen.
Und für HTML ist htmlspecialchars() vorgesehen.
Lo!