Andreas Bockhold: Benutzeranmeldung mit Namen und Passwort

Hallo,

ich bin dabei mir eine Benutzeranmeldung mit PHP und Datei als "Benutzerdatenbank" zu bauen. Leider funktioniert das Script nicht ganz so wie ich möchte:

<?php
  // Datei mit Benutzernamen und Kennwörtern, wie: benutzer=kennwort
  $userdb_file = file ('sec/passwd.txt');
  // Grundeinstellung ob Benutzer bekannt: nein
  $knownuser = "false";
  // Wurde vorgeschaltetes Formular ausgefüllt?
  if ( isset($name) && isset($passwort) && $name != "" && $passwort != "" )
    {
    // ja: Extrahiere aus den Zeilen der Datei Benutzernamen und Kennwort
    foreach ($userdb_file as $user_num => $user_string)
      {
      // $user_string wird in Name $userdb_array[0] und Passwort $userdb_array[1] aufgeteilt
      $userdb_array = explode ("=",$user_string);
      // Wenn eingegebener Name $name und Passwort $passwort mit einem Paar aus der Datei übereinstimmt,
      // setze Einstellung, dass Benutzer bekannt
      if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )
        {
        $knownuser = "true";
        }
      }
    }
  else
    {
    //nein: Meldung ausgeben
    echo "Nicht angemeldet.";
    }
  if ($knownuser == "true")
    {
    echo "Validierter User";
    }
  else
    {
    echo "Nicht angemeldet!";
    }
?>

Die Passwortdatei sieht folgendermaßen aus:

benutzer1=passwort1
benutzer2=passwort2
benutzer3=passwort3

Mein Problem ist, dass man sich immer nur als der Benutzer, der als letztes in der Passwortdatei genannt wird, anmelden kann (in meinem Beispiel also als "benutzer3"). Woran liegt das und wie muss ich das foreach-Konstrukt abwandeln, dass es mit allen Benutzern geht?

Vielen Dank,
Andreas

  1. Hallo,

    Warum machst Du es nicht mit htaccess?

    Heiner

    1. Hi,

      Warum machst Du es nicht mit htaccess?

      ich möchte in einer Seite einen für alle lesbaren Teil und einen, der erst nach Anmeldung in dieser Seite zu sehen ist, haben. Mit .htaccess kann ich aber nur ganze Seiten schützen...

      MfG
      Andreas

  2. Moin!

    Erster gefundener möglicher Fehler:

    if ( isset($_POST['name']) && isset($_POST['passwort']) && $_POST['name'] != "" && $_POST['passwort'] != "" )

    Aktuelle Sicherheitseinstellungen aktueller PHP- Versionen verhindern eine globale und ungefragte Übernahme von Formulardaten in Variablen.

    Zweiter gefundener möglicher Fehler:

    Wo liest Du Deine Daten aus dem userdb_file ein?
    Da müsste was fopen, fget und so weiter zu finden sein.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Meinereinerselbst ist auf der Suche nach Aufträgen
    1. hi,

      Zweiter gefundener möglicher Fehler:
      Wo liest Du Deine Daten aus dem userdb_file ein?
      Da müsste was fopen, fget und so weiter zu finden sein.

      oberste zeile im script:
      $userdb_file = file ('sec/passwd.txt');

      gruss,
      wahsaga

    2. Danke für deine Antwort!

      [...]

      Aktuelle Sicherheitseinstellungen aktueller PHP- Versionen
      verhindern eine globale und ungefragte Übernahme von Formulardaten
      in Variablen.

      Hm, ich kann die Variablen aber per
        echo $name;
      ausgeben... Daran dürfte es als eigentlich nicht liegen.

      Wo liest Du Deine Daten aus dem userdb_file ein?
      Da müsste was fopen, fget und so weiter zu finden sein.

      In der vierten Zeile:
        // Datei mit Benutzernamen und Kennwörtern, wie: benutzer=kennwort
        $userdb_file = file ('sec/passwd.txt');
      Darüber steht eigentlich die Datei unter $userdb_file zur Verfügung.

      MfG
      Andreas

  3. Deine foreach-Schleife wird grundsätzlich dreimal durchlaufen (da drei Einträge in der Passwortdatei). Und nach den Durchläufen bleibt immer die letzte Zeile (also benutzer3) gespeichert.

    Du musst irgendwo in dieser Schleife ein "break" einführen, damit die Schleife abgebrochen wird, sobald eine Eingabe mit einem Eintrag in der Passwortdatei übereinstimmen.

    1. Hallo,

      Deine foreach-Schleife wird grundsätzlich dreimal durchlaufen (da
      drei Einträge in der Passwortdatei). Und nach den Durchläufen
      bleibt immer die letzte Zeile (also benutzer3) gespeichert.

      Das müsste aber doch eigentlich egal sein, da doch die Information, ob der Benutzer berechtigt ist, unabhängig von dessen Namen in der Variablen $knownuser gespeichert wird:
         $knownuser = "true";

      Du musst irgendwo in dieser Schleife ein "break" einführen, damit
      die Schleife abgebrochen wird, sobald eine Eingabe mit einem
      Eintrag in der Passwortdatei übereinstimmen.

      Auf die Idee war ich auch schon mal gekommen, da ich aber noch Anfänger bin, stellt sich mir die Frage wo genau ich das einfügen muss. In der if-Bedingung funktioniert es nämlich nicht...

      MfG
      Andreas

  4. Hi,

    $userdb_file = file ('sec/passwd.txt');

    Vorsicht: so kann die Datei von jedem aufgerufen werden!

    if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )

    moeglicherweise stecken da Leerzeichen drinne, daher scheitert ein Vergleich. Versuch mal trim().

    Btw: Generell wuerde ich sowas eher mit einer Session loesen.

    hth + Gruesse  Joachim

    1. Hallo,

      $userdb_file = file ('sec/passwd.txt');
      Vorsicht: so kann die Datei von jedem aufgerufen werden!

      naja, zum einen werden (wenn ich das bestehnde Problem gelöst habe) alle Benutzernamen und Passwörter verschlüsselt gespeichert werden, zum anderen liegt diese Datei in einem Verzeichnis, in dessen .htaccess-Datei "Deny from all" steht.

      if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )
      moeglicherweise stecken da Leerzeichen drinne, daher scheitert ein Vergleich. Versuch mal trim().

      Danke für den Hinweis, das könnte vielleicht später Probleme verursachen, zur Zeit muss  das Problem aber anderwo liegen, da ich die im Ursprungsposting angegebene Benutzer/Kennwortdatei zum Testen verwende. Und in den Namen/Kennwörtern der Datei gibt es wie du sehen kannst keine Leerzeichen.

      Btw: Generell wuerde ich sowas eher mit einer Session loesen.

      Hm, ich bin Programmier und PHP-Anfänger, deshalb habe ich derzeit leider überhaupt keine Ahnung von Sessions...

      MfG
      Andreas

      1. Hi,

        Danke für den Hinweis, das könnte vielleicht später Probleme verursachen, zur Zeit muss  das Problem aber anderwo liegen,

        sicher? Wenn ich Dein (abgewandeltes) Script so aufrufe geht es:

        <?php

        $userdb_file[] = "bla=bluh";
        $userdb_file[] = "foo=bar";
        $userdb_file[] = "xxx=yyy";

        $knownuser = false;

        if (isset($_GET["name"]) && isset($_GET["passwort"]) && $_GET["name"] && $_GET["passwort"]) {
         foreach ($userdb_file as $user_num => $user_string) {
          $userdb_array = explode ("=",$user_string);
          if ($name == $userdb_array[0] && $passwort == $userdb_array[1] ) {
           $knownuser = true;
          }
         }
        } else {
         echo "Nicht angemeldet.";
        }
        echo $knownuser? "Validierter User" : "Nicht angemeldet!";

        ?>

        BTW: true und false sind boolsche Werte und _keine_ Strings!

        Gruesse  Joachim

        1. Hallo,

          es ist zum Heulen, wenn ich dein Script aufrufe, geht es auch bei mir.

          Nehme ich dann allerdings wieder meine Datei als Datenquelle anstatt deines direkt definierten Arrays geht es nicht mehr ... bzw. es kann sich wieder nur noch der letzte Benutzer anmelden (in diesem Falle jetzt "xxx" mit "yyy" als Kennwort).

          Auch das das Einfügen der Zeile
            foreach ($userdb_file as $key=>$value) { $db[$key]=trim($value); }
          hat daran nichts verändert (wobei tatsächlich der Zeilenumbruch hinter jedem Wertepaar evtl. eine Fehlerquelle sein könnte?).

          BTW: true und false sind boolsche Werte und _keine_ Strings!

          Ups, stimmt, da müssen die Gänsefüßchen weg...

          Hast du vielleicht noch eine zündende Idee?

          Ich bin leider irgendie am Ende mit meinem Latein.

          MfG
          Andreas

          PS: Oder könntest du mir einen Tip geben, wie ich das mit Sessions lösen könnte? Wenn gar nichts anderes hilft...

  5. Hallo erstmal...

    Guck doch auf http://www.php4-forum.de
    Dort findest Du ein Beispiel-Login-Script, das
    Deine User aus der DB ausliest... Wesentlich
    praktikabler, zumal sich jetzt auch User registrieren
    könnten...

    Viele Grüße

    Chris