Sven Rautenberg: Wahnsinn... PHP abfrage nach einen kennwort

Beitrag lesen

Moin!

Mein Code:

...ist kritikwürdig, was ja auch nicht anders zu erwarten war.

<?php

include("kontakt.inc");

Du stellst hier eine Verbindung zur Datenbank her.

$verbindung = mysql_connect($host, $user, $pwd);

Und dann stellst du nochmal eine Verbindung zur Datenbank her, diesmal aber mit Unterdrückung der Fehlermeldung.

if(@mysql_connect($host, $user, $pwd))

Ist irgendwie doppelt gemoppelt, außerdem speicherst du beim zweiten Mal das Handle für den späteren Zugriff nicht.

{
 echo "<hr>Es wird eine Verbindung zu unserem Datenbankserver hergestellt... \n";
 echo "<hr> Bitte haben Sie einen augenblick geduld...<hr\n";

Der Browser wird diese Informationen ohnehin erst anzeigen, wenn PHP komplett fertig gelaufen ist. Sie sind für die Fehlersuche vielleicht interessant, für den Benutzer aber nicht - den interessiert absolut nicht, ob du eine Datenbank im Hintergrund laufen hast, oder was du sonst noch so treibst.

if(@mysql_select_db($dbname))

{
  $erg = @mysql_query("SELECT benutzername, kw FROM BENUTZER");

Hier fragst du die Datenbank ab (bis hierher eigentlich alles in Ordnung bis auf die Kommentare).

Du fragst _alle_ Benutzernamen und Passworte ab. Warum _alle_? Dich interessiert doch nur der Benutzername, dessen Username im Formular übergeben wurde. Dessen Passwort ist interessant, nicht das aller anderen.

Du solltest also die SQL-Abfrage entsprechend ändern:
@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}'");

$_POST ermöglicht den in Zukunft nur noch funktionierenden Zugriff auf Formulardaten, die mit method="POST" gesendet wurden (für method="GET" und URL-Parameter nimmt man $_GET).

Dann kriegst du hoffentlich nur _einen_ Eintrag, nämlich den des passenden Benutzers. Wenn du _keinen_ Eintrag erhälst, oder wenn du _mehr_ als einen Eintrag erhälst, hast du ein Problem: Entweder den Benutzer gibts noch nicht (dann kannst du ihn abweisen - sag aber nicht, dass der Benutzername falsch ist - auf diese Weise kann man ausprobieren, welche Benutzernamen es gibt, und dann für einen existierenden Benutzernamen Passwörter ausprobieren - sag einfach nur, dass die Anmeldung fehlgeschlagen ist.), oder es gibt den Benutzer zweimal. Es darf aber keine _zwei_ (oder mehr) identische Benutzernamen geben, ansonsten kannst du die Benutzer nicht mehr eindeutig identifizieren. Und genau das willst du.

Fehlt noch die Prüfung des Passwortes. Diese kann man ebenfalls ganz prima in die SQL-Abfrage packen:

@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '{$_POST['kw']}'");

Dieser Ausdruck holt dir nur noch die Benutzereinträge, die in Benutzername und Passwort übereinstimmen.

Das praktische daran: Du mußt im Prinzip nur noch gucken, ob du genau einen Eintrag erhälst. Wenn du mehr oder weniger als einen Eintrag erhälst, ist irgendwas falsch gelaufen, und du kannst den Benutzer abweisen.

Wenn du das Kennwort md5-verschlüsselt in der Datenbank abspeicherst, dann könntest du mit
@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");
arbeiten. Die Funktion md5() verschlüsselt das Klartextpasswort. Benutze im Zweifel hier die identische Methode, die du auch zum Eintragen des Passwortes in die Datenbank benutzt.

if($erg)

{
   echo "<hr>Ausgabe der Datensätze....<hr>\n";
   while($row = mysql_fetch_row($erg))

Wenn du, wie oben geschildert, die Prüfung der Anmeldedaten von der Datenbank erledigen läßt, kannst du dir das Auslesen und Prüfen aller Usereinträge hier sparen. Wenn du einige Millionen User hast, wäre das nämlich ziemlich zeitaufwendig.

if ($benutzername==$row[0] && $kw==$row[1])
    {
    echo "verwaltung.htm\n";

Tja, das ist schön, gibt den Text "verwaltung.htm" im Browser aus. Sollte das was anderes machen?

}
    else
    echo "Benutzername und Kennwort ist falsch!\n";

"Benutzername oder Kennwort falsch" wäre technisch korrekt formuliert.

}
  else
   echo "<hr>Es konnten keine Datensätze gefunden werden... FEHLER!<hr>\n";
  }
 else
  echo "<hr>Keine Verbindung zu Datenbankserver... FEHLER!<hr>\n";
 mysql_close();
 }
    else
     echo "<hr>Verbindungsaufbau fehlgeschlagen... FEHLER!<hr>\n";
?>

Ich denke... ich mach keine besonderen Eindruck mit diesem Code oder?

Nicht wirklich. Du bist in PHP eingestiegen (sieht auf dieser Seite schon ganz ok aus), aber es mangelt am Datenbankverständnis noch erheblich.

- Sven Rautenberg

--
"Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
0 44

Wahnsinn... PHP abfrage nach einen kennwort

MichaelS
  • php
  1. 0
    Carl
  2. 0
    fastix
  3. 0
    Lemmy Danger
  4. 0
    Tobias K.
    1. 0
      MichaelS
      1. 0
        Tobias K.
        1. 0
          MichaelS
          1. 0
            Sorgenkind Mech
            1. 0
              Lemmy Danger
              1. 0
                Sorgenkind Mech
                1. 0
                  MichaelS HILFE !!!!
                  1. 0
                    Lemmy Danger
                  2. 0
                    Sorgenkind Mech
                    1. 0
                      MichaelS
                      1. 0
                        Sorgenkind Mech
                        1. 0
                          MichelS...
                    2. 0
                      DAS IST RICHTIG MichaelS... hatte fehler dinnen
                      1. 0
                        Sorgenkind Mech
                        1. 0
                          MichaelS
                          1. 0
                            Sorgenkind Mech
                            1. 0
                              Michaels
                              1. 0
                                Sorgenkind Mech
                          2. 0
                            Tobias K.
                            1. 0
                              MichaelS
                              1. 0
                                Tobias K.
                          3. 0
                            Lemmy Danger
                            1. 0
                              MichaelS
                              1. 0
                                Tobias K.
                                1. 0
                                  MichaelS
                                  1. 0

                                    Gott sei dank...

                                    Lemmy Danger
                                    1. 0
                                      Tobias K.
                              2. 0
                                Lemmy Danger
                                1. 0
                                  Tobias K.
                  3. 0
                    Tobias K.
                2. 0
                  Lemmy Danger
                  1. 0
                    Sorgenkind Mech
                3. 0
                  Christian Seiler
      2. 0
        Sven Rautenberg
        1. 0
          AnalphaBestie
          1. 0

            Was soll ich werden? ;)

            Sven Rautenberg
            • menschelei
        2. 0

          Aufnahme von vertrauensunwürdigen Parametern in die MySQL-Query

          molily
          • datenbank
          1. 0
            Sven Rautenberg
  5. 0
    Matze