Eddie: Datenbanken / Sicherheit

Hi!

Mein Skript erhaelt Eingaben ueber ein Formular, unter anderem 'nickname'.
Ich suche dann aus meiner user-db die Daten zum entsprechenden 'nickname' raus, á la:

'SELECT id FROM table WHERE userName = '.$nickname;

Frage: bestehen da irgendwelche Sicherheitsprobleme, z.B. wenn der User direkt an seinen Namen noch ein paar SQL-Befehle dranhaengt?

Was kann ich dagegen tun?

Und: gibt es eine fertige Funktion, die mir $nickname durchsucht und problematische Sonderzeichen (z.B. ') SQL-konform kaschiert?

Danke!

  1. Halihallo

    Mein Skript erhaelt Eingaben ueber ein Formular, unter anderem 'nickname'.
    Ich suche dann aus meiner user-db die Daten zum entsprechenden 'nickname' raus, á la:

    'SELECT id FROM table WHERE userName = '.$nickname;

    Frage: bestehen da irgendwelche Sicherheitsprobleme, z.B. wenn der User direkt an seinen Namen noch ein paar SQL-Befehle dranhaengt?

    Ne, es sei denn, dass man mit ';' separiert mehrere SQL-Queries abfragen könnte. Ist aber nicht so... Sonst würde der Nickname "blabla; DELETE * FROM table"... Naja... selbsterklärend...

    Was kann ich dagegen tun?

    Nicknames haben z. B. keine Leerzeichen und sind meist auch nicht länger als 30 Zeichen => überprüfen des Inhaltes und Kriterien für "ungültige Nicknames" festlegen. Wenn du es sicher haben willst:

    $q = 'SELECT id FROM table WHERE userName="'.$nickname.'"';

    wobei du alle '"' in $nickname und sonstige "komische" Zeichen kodierst (oder z. B ';' gar nicht erlaubst oder kodierst), somit wird der SQL-Parser den Nickname auch als solchen behandeln und der böse Bub, der die Site knacken will, wird scheitern.

    Viele Grüsse

    Philipp

    PS: Fazit: Wenn du userName="bla" (die " sind wichtig!) verwendest und die " im Nickname selber kodierst '"', dann wirst du keine Probleme haben.

  2. Hallo,

    Mein Skript erhaelt Eingaben ueber ein Formular, unter anderem 'nickname'.
    Ich suche dann aus meiner user-db die Daten zum entsprechenden 'nickname' raus, á la:

    'SELECT id FROM table WHERE userName = '.$nickname;

    Das wird nicht funktionieren, es sei denn deine Datenbank gehorcht _nicht_ dem SQL-Standard. Strings müssen _immer_ in Anführungszeichen gesetzt werden:

    $query = "SELECT id FROM table WHERE userName = '".$nickname."'";

    Frage: bestehen da irgendwelche Sicherheitsprobleme, z.B. wenn der User direkt an seinen Namen noch ein paar SQL-Befehle dranhaengt?

    Das könnte passieren.

    Was kann ich dagegen tun?

    Und: gibt es eine fertige Funktion, die mir $nickname durchsucht und problematische Sonderzeichen (z.B. ') SQL-konform kaschiert?

    Also: PHP macht das mit eingeschalteten magic quotes automatisch mit jeder Eingabevariable aus GET, POST und Cookies. Ich persönlich mag magic quotes aber nicht, ich möchte selbst die Kontrolle behalten, was mit meinen Variablen geschieht.

    Zum Thema Maskierung: PHP kodiert Standardmäßig die ganzen ' als ' was für die meisten Datenbanken auch ok ist. Wenn Du das Verhalten selbst erzwingen willst (so wie ich, weil ich magic quotes ausschalte) dann kannst du addslashes (http://php.net/de/addslashes) nehmen. Wenn Du Sybase oder Oracle verwendest, dann funktioniert das ganze nicht, weil diese statt _einem_ _einfachen_ Anführungszeichen _zwei_ _einfache_ Anführungszeichen erwarten, wenn es kodiert sein soll. (also '' statt ') Dann kannst Du entweder magic_quotes_sybase noch zusätzlich anstellen (in der php.ini) oder du kannst str_replace ("'", "''", $string) (http://php.net/de/str_replace) verwenden. Ob nun magic quotes oder manuell, vorbeugen kann man auf jeden Fall. Weiter unten gab's auch einen Thread dazu: </?m=126350&t=22738> (bzw. </archiv/2002/9/22738/> sobald er im Archiv gelandet ist)

    Grüße,

    Christian