dedlfix: MySQL:Userdaten werden nicht korrekt ausgelesen

Beitrag lesen

echo $begrüßung;

$row=mysql_fetch_object(mysql_query("SELECT * FROM user WHERE nick='".$nick."'"));

Du übernimmst den per POST gesendeten Wert direkt? Was wäre, wenn jemand für $_POST['nick']
meinnickname'; DELETE * FROM users;
eingibt? Dann wird das Query zu
SELECT * FROM user WHERE nick='meinnickname'; DELETE * FROM users;
und die ganze Tabelle wird gelöscht (zum Beispiel, da geht noch einiges mehr).

Nein, da geht nichts mehr. Schon seit einiger Zeit ist es nicht mehr möglich, mehrere Befehle mit einem mysql_query()-Aufruf abzusetzen. Dazu braucht man PHP5, mysqli und die Funktion mysqli_multi_query(). Natürlich kann man immer noch das eine Statement so umschreiben, dass was anderes als das Gewünschte ausgeführt wird. Außerdem muss magic_quotes ausgeschaltet sein, sonst sind die Angriffsmöglichkeiten auch schon etwas eingeschränkter. Magic Quotes wirken sich aber nicht nur bei Datenbankbefehlen prositiv aus, sie sind an anderen Stellen kontraproduktiv, beispielsweise da, wo die Eingabe auf dem Bildschirm landen soll. Deswegen ist es empfehlenswert, die Magic Quotes generell auszuschalten, oder die eingefügten Maskierungen am Scriptanfang zu entfernen, die eingegebenen Daten auf Plausibilität zu prüfen und erst direkt vor der Übergabe an das Ausgabemedium entsprechend zu maskieren.

Link des Tages: mysql_escape_string()

Für MySQL nimmt man dafür die Funktion mysql_real_escape_string(). Das von dir vorgeschlagene mysql_escape_string() ist veraltet und soll nicht mehr genommen werden.

if ($pass_sql==$pass) {    //Wenn pass richtig, dann Kekse setzen
setcookie( "nick", $nick);
setcookie( "pass", $pass);

Du speicherst das Passwort direkt, unverschlüsselt als Cookie? Das kann dann jeder lesen!
Link des Tages: md5()

Der "Link des Tages" ist schon verbraucht. Was willst du mit dem md5() anstellen? Da fehlt doch noch das passende Gegenstück in der Datenbank dazu. Wo ist außerdem der Unterschied, ob man ein Passwort mit einem Passwort oder einen MD5-String mit einem MD5-String vergleicht? Es wäre erst einmal zu klären, wozu Nick und Passwort aufgehoben werden. Dann kann man ein dafür passenderes Konzept vorschlagen.

Und wenn jemand kein Javascript aktiviert hat? Dann wird er weder weitergeleitet noch sieht er die Meldung.
Link des Tages: Meta Refresh

Der "Link des Tages" ist schon verbraucht. Das Ausführen von Meta-Refresh kann man dem Browser auch verbieten. Außerdem wird dadurch der Back-Button-Mechanismus kaputt gemacht. Und warum soll man den Ersatz (http-equiv=HTTP-Äquivalent) nehmen, wenn dank PHP das Original in Form eines "echten" HTTP-Mechanismus vorhanden ist, so solch eine Weiterleitung unbedingt erforderlich ist: header('Location: vollständige URL');

echo "$verabschiedung $name";