Postdaten und Sicherheit

Wolfsbein

Erfahrenes Mitglied
Hallo
ich möchte von euch mal wissen, wie ihr POST/GET Daten validiert, die in eine DB kommen? Also ein stripslashes() und ein htmlentities()ist ja klar. Ich ersetze dann gerne noch # und ;. Macht jemand von euch noch was entscheidendes dazu? Und wie macht man das am besten? Habt ihr eine eigene Funktion? Der Code wird natürlich nicht mit eval() ausgeführt ;). Aber mit einem # kann man doch schon ziemlich viel anrichten.
 
Original geschrieben von Wolfsbein
SQL Kommentare stehen nach einer #. Somit kann man sich z.B. einloggen, ohne dass das Passwort überprüft wird.

Solang Du sorgfältig auf Slashes, etc. achtest kann eigentlich nichts passieren. ; oder # zu ersetzen halte ich nicht für sinnvoll. Man muss halt sorgfältig arbeiten. Wenn du in einer Variable die aus nem Form kommt nur eine Zahl erwartest, schreib nicht blind das rein was aus dem Form kommt sondern mach nen (int)$variable. Bei Textfeldern reicht IMHO ein addslashes aus damit keiner aus Deinem SQL-Statement ausbricht.

-Chris
 
Original geschrieben von Wolfsbein
Wenn man aber ein addslashes('#'); macht, dann kommt wieder ein # raus. Also sollte man es doch ersetzen?

Nur wenn Du eh schon Murks baust...

IMHO ist ein # in Feldern unproblematisch... sofern Du halt dafür sorgst das Felder in denen Du nur Zahlen erwartest nur Zahlen enthalten und Felder in denen Du Strings erwartest entsprechend in ' oder " eingeschlossen sind...

Der springende Punkt ist einfach ein sauberes Handling von Formulardaten... also keine ungeprüfte Übernahme von Form-Daten in Queries... also niemals

PHP:
$res=mysql_query('DELETE FROM irgendwo WHERE username = "'.$HTTP_POST_VARS['name'].'"');

sondern immer brav sowas im Stil von

PHP:
$uname = addslashes(HTTP_POST_VARS['name']);

$res=mysql_query('DELETE FROM irgendwo WHERE username = "'.$uname.'"');

...dann sollten sowohl ' und " oder # kein Thema sein. Man muss halt sorgfältig darauf achten, dass User nicht mit Tricks aus der SQL-Query ausbrechen können. Semikolons sind in der Regel mit MySQL auch absolut ungefährlich. Es sei denn man ist so verrückt und schreibt eine Funktion die explizit mehrere Queries per Semikolon getrennt abarbeiten kann. Von Haus aus ignoriert mysql_query allerdings so Konstrukte wie "SELECT * FROM tabelle; DELETE FROM tabelle WHERE a = 1" - da wirst Du nur einen MySQL-Error bekommen (siehe auch im Manual unter mysql_query)

Letztenendes ist der springende Punkt, Variablen nur in einem fest definierten Zustand ins Script zu bekommen und die entsprechend zu behandeln. Wenn Du Dich z.B. nicht drum kümmerst wie in der PHP.INI die entsprechenden Optionen gesetzt sind (z.B. magic_quotes_runtime) wirst Du immer in problematische Situationen kommen. Sei es weil Daten verloren gehen (weil Du z.B. ein unnötiges stripslashes machst) oder Queries unsicher werden (weil Du z.B. darauf vertraust das die Variablen schon mit Slashes reinkommen obwohl sie es nicht tun)

Schau Dir z.B. mal den Sourcecode von phpBB an. Die sorgen als allererstes dafür, dass egal wie magic_quotes runtime gesetzt ist, die Variablen die von aussen kommen, *immer* Slashes vor den Hochkommas, etc. haben.
 
Zurück