Maike: Passwortabfrage funktioniert nicht (Endlosschleife?)

Hallo Jungs und Mädels,

meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen Fehler?

----Inhalt-passwd.txt----

admin|admin
test|test

----Inhalt-passwd.php----

<form method="post" action="passwd.php">
<input type="text" name="user" value="user">
<input type="text" name="passw" value="password">
<input type="submit" value=" SEND ">
</form>

<?php
if ($_POST['user'] != "")
{
$fd = fopen(passwd.txt, 'r');
$i = 0;
while(!$fd) // solange, wie Dateiende nicht erreicht
{
//Zeilenweise einlesen
$userundpass = file(passwd.txt);
// einzelne Zeile auseinandernehmen
$ex = explode('|', $userundpass[$i]);
$benutzer[$i] = $ex[0];
$passwort[$i] = $ex[1];
$i++;
}

// Überprüfung, ob Formulardaten übereinstimmen
$j = $i;
for($i=0;$i<=$j;$i++)
{
if($_POST['user']==$benutzer[$i] && $_POST['passwd']==$passwort[$i])
echo 'Login erfolgreich!';
else
echo 'Falscher Benutzername oder Kennwort!';
}
fclose($fd);
}
?>

mfg Maike

  1. Viel zu kompliziert.

    erst die textdatei mit file(datei) auslesen,
    dann das array nach "$user|$pwd" durchsuchen, wenn true, dann login.

    gruß
    y

  2. Hallo Jungs und Mädels,

    meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen »»

    Ich hab gerade in meine Errorlog reingeschaut. So ne lange errorlog hab ich noch nie gesehen!

    PHP Warning:  file(passwdtxt): failed to open stream: No such file or directory in /web/fotos/detail_test.php on line 274
    obwohl ich passwd.txt immer mit dem punkt zwischen passwd und txt geschrieben habe. Versteh ihr das?

    Maike

    1. der dateiname ist ein String, also:
      file("pwd.txt");
      oder
      $datei = "pwd.txt";
      file($datei);
      s

      1. Hallo,

        $datei = "pwd.txt";
        file($datei);

        Danke, das wars.

        Trotzdem funktioniert es einfach nicht

        <form method="post" action="passwd.php">
        <input type="text" name="user" value="user">
        <input type="text" name="passw" value="password">
        <input type="submit" value=" SEND ">
        </form>
        </p>

        <?PHP

        $file="passwd.txt";

        $fd = fopen($file, 'r');
        $i = 0;
        while(!$fd) // solange, wie Dateiende nicht erreicht
        {
        //Zeilenweise einlesen
        $userundpass = file($file);
        // einzelne Zeile auseinandernehmen
        $ex = explode('|', $userundpass[$i]);
        $benutzer[$i] = $ex[0];
        $passwort[$i] = $ex[1];
        $i++;
        }

        // Überprüfung, ob Formulardaten übereinstimmen
        $j = $i;
        for($i=0;$i<=$j;$i++)
        {
        if($_GET['user']==$benutzer[$i] && $_GET['passwd']==$passwort[$i])
        echo 'Login erfolgreich!';
        else
        echo 'Falscher Benutzername oder Kennwort!';
        }

        fclose($fd);

        ?>

        Es gibt immer 'Login erfolgreich aus'.

        Wo ist der Fehler?

        mfg Maike

        1. Huhu Maike

          Trotzdem funktioniert es einfach nicht

          POST != GET

          while(!$fd) // solange, wie Dateiende nicht erreicht
          {
          //Zeilenweise einlesen
          $userundpass = file($file);
          // einzelne Zeile auseinandernehmen
          $ex = explode('|', $userundpass[$i]);
          $benutzer[$i] = $ex[0];
          $passwort[$i] = $ex[1];
          $i++;
          }

          diese while-Schleife ist in Kombination mit file nicht sinnvoll, da
          die Funktion file bereits die komplette Datei einliest.
          (Schau mal im Manual nach was file tut)
          Hier ensteht sogar eine Endlos-Schleife (sobald $fd wahr ist).

          Dann müssen vor dem Stringvergelich noch die Newlinezeichen entfernt werden. (z.B. per trim)

          Viele Grüße

          lulu

          --
          bythewaythewebsuxgoofflineandenjoytheday
    2. Huhu Maike

      obwohl ich passwd.txt immer mit dem punkt zwischen passwd und txt geschrieben habe. Versteh ihr das?

      Ja.

      Setze den Level für Dein error-reporting hoch.
      Z.B. am Anfang Deines Skriptes mit
      ini_set('error_level', E_ALL);

      dann wird Dir die Ursache dieses Fehlers mitgeteilt ;-)

      Viele Grüße

      lulu

      --
      bythewaythewebsuxgoofflineandenjoytheday
      1. Huhu again

        ini_set('error_level', E_ALL);

        ist natürlich so falsch,es  muss richtig heissen

        ini_set ('error_reporting', E_ALL);

        sorry und viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
  3. Hello,

    für das Wegschreiben und Holen von Datenstrukturen bietet PHP die Funktionen serialize() und unserialze(). Damit kann man bestens _ein_ grosses Array "verpacken" und in einer Datei speichern.

    schreiben mit fwrite(),
    lesen mit fread($fh,filesize($dateiname));

    nicht mit fgets() oder ähnlich, da auch das Array \n enthalten kann und würden dann zu Fehlern führen.

    Wenn mehr als ein Array wegspeichern will, muss man die einzelnen Arrays entweder wieder in einem großen binden, oder aber die Newlines vorher ersetzen. Das ist speziell bei binären Werten nicht einfach möglich.

    Grüße

    Tom

    1. Hallo Tom,

      für das Wegschreiben und Holen von Datenstrukturen bietet PHP die Funktionen serialize() und unserialze(). Damit kann man bestens _ein_ grosses Array "verpacken" und in einer Datei speichern.

      schreiben mit fwrite(),
      lesen mit fread($fh,filesize($dateiname));

      nicht mit fgets() oder ähnlich, da auch das Array \n enthalten kann und würden dann zu Fehlern führen.

      Wenn mehr als ein Array wegspeichern will, muss man die einzelnen Arrays entweder wieder in einem großen binden, oder aber die Newlines vorher ersetzen. Das ist speziell bei binären Werten nicht einfach möglich.

      Ich verstehe das nicht so richtig.

      Wärst du so lieb, mir das am konkreten Beispiel zu erklären?

      mfg Maike

      1. Hello Maike,

        gegeben ist ein array:

        $ini_data = array();

        $ini_data["password"] = "xyZ08/16k1e8ung";
        $ini_data["username"] = "Hans Wurst";
        $ini_data["last_log"] = date("d.m.Y  H:i:s");

        Diese Daten wollen wir nun in einer Datei sichern, damit sie für dieses und andere Scripte fortan nutzbar sind:

        $dateiname = "inidata.dat.php";

        die Datei zum Schreiben öffnen

        $fh = fopen($dateiname,"w");   .

        Die zu sichernden Daten in einem Stream (~ String) verpacken

        $file_data = serialize($ini_data);

        Die verpackten Daten in die Datei schreiben

        fwrite($fh, $file_data);

        die Datei schließen

        fclose($fh);

        Nun haben wir ein weiteres Script, dass nur ausgeführt werden darf, wenn per Post das richtige Passwort und der richtige Username übermittelt wurden:

        ...
        $pass = "";
        if (isset($_POST["pass"])
        {
          $pass = trim($_POST["pass"]);
        }

        $user = "";
        if (isset($_POST["user"])
        {
          $user = trim($_POST["user"]);
        }

        inidaten lesen

        $file_data = file_get_contents("inidata.dat.php");

        inidaten wieder in Array zurückverwandeln.

        $ini_data= unserialize($file_data);

        if (($ini_data["password"] != $pass)
            or ($ini_data["username"] != $user))
        {
          echo "Sie haben keinen Zugang!<br />";
          exit;
        }

        echo "Herzlich Willkommen $user. Ihr letzter Login war ".
             "$ini_data["last_log"]."<br />";

        $ini_data["last_log"] = date("d.m.Y  H:i:s");

        und dann wieder wegschreiben:
        Das ist der Text von oben. Da macht man am besten eine
        schöne Funktion draus, die einen Rückgabewert liefert,
        ob es geklappt hat.

        $dateiname = "inidata.dat.php";

        die Datei zum Schreiben öffnen

        $fh = fopen($dateiname,"w");   .

        Die zu sichernden Daten in einem Stream (~ String) verpacken

        $file_data = serialize($ini_data);

        Die verpackten Daten in die Datei schreiben

        fwrite($fh, $file_data);

        Nun hoffe ich, dass Die das als Beispiel für Serialize(), unserialize(), file_get_contents(), usw reicht.

        Liebe Grüße

        Tom

        #... Rest vom Script...

        1. Hello Maike,

          in diesem Skript steckt noch ein gefährlicher Fehler:

          ...
          $pass = "";
          if (isset($_POST["pass"])
          {
            $pass = trim($_POST["pass"]);
          }

          $user = "";
          if (isset($_POST["user"])
          {
            $user = trim($_POST["user"]);
          }

          inidaten lesen

          $file_data = file_get_contents("inidata.dat.php");

          Wenn die inidata-Datei z.B. leer ist, sollte man abbrechen!

          if (strlen($file_data) < 10) die("Passwortdatei nicht lesbar");

          inidaten wieder in Array zurückverwandeln.

          $ini_data= unserialize($file_data);

          Grüße

          Tom

  4. Hallo Maike,

    Hallo Jungs und Mädels,

    meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen Fehler?

    Dir ist aber schon klar, dass Deine Passwortabfrage äußerst unsicher ist? Auf die Textdatei kann _jeder_ zugreifen. Und bei unverschlüsselten Passwörtern muss man kein Genie sein um zu verstehen wie man sie benutzt.

    Gruß,
    small-step