Rene Grassegger: Fehler in Passwortabfrage

Hallo Leute,

ich habe mit PHP eine einfache Passwortabfrage erstellt. Leider wird anscheinend nur die 1. Zeile der Passwort-Datei ausgelesen.

Kann mir bitte jemand sagen, was ich falsch mache?

Quelltext der PHP Datei:

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
@import url(../../css/css.css);
-->
</style>
<body bgcolor="#FFFFFF" text="#000000" background="../../images/back.gif" class="schrift" leftmargin="0" topmargin="0" style="scrollbar-arrow-color:#ffffff;scrollbar-base-color:#ffffff;scrollbar-track-color:#000066;scrollbar-darkshadow-color: #000066;scrollbar-3dlight-color: #000066;scrollbar-shadow-color: #ffffff;scrollbar-highlight-color: #ffffff"  oncontextmenu="return false">
<?php
        if (($HTTP_POST_VARS['username'] !=="") && ($HTTP_POST_VARS['passwort']!=="")) {
  $filename = "pass.xtx";
  $fp = fopen($filename, "r");
  $file_contents = fread($fp, filesize($filename));
  fclose($fp);

// Place each line in user info file into an array

$line = explode(";", $file_contents);

// For as long as $i is <= the size of the $line array,
  // explode each array element into a username and password pair

$i = 0;

while($i <= sizeof($line)) {
   $data_pair = explode(",", $line[$i]);
   if (($data_pair[0] == $HTTP_POST_VARS['username']) && ($data_pair[1] == $HTTP_POST_VARS['passwort'])) {
                $auth = 1;
                $link = $data_pair[2];
    break;
   } else {
    $auth = 0;
            }
            $i++;
  }

if ($auth =="1") {
  echo '<p>&nbsp;</p><p>&nbsp;</p><h1 align="center">Klicken Sie hier, um das Programm zu starten.</h1>';
        echo '<p align="center"><a href="'.$link.'">Eurofinanz Berechnungsprogramm</a></p>';
        echo '</body></html>';
        exit;
        }else {
   echo '<p>&nbsp;</p><p>&nbsp;</p><h2 style="font-weight: bold; color: red" align="center">Der Benutzername oder das Passwort sind nicht korrekt!</h2>';
      echo '<p align="center"><a href="../jump.php?url=login/">Zur&uuml;ck</a><p>';
      echo '</body></html>';
         }
       } else {
        echo '<p>&nbsp;</p><p>&nbsp;</p><h2 style="font-weight: bold; color: red" align="center">Sie m&uuml;ssen Benutzernamen und Passwort angeben!</h2>';
        echo '<p align="center"><a href="../jump.php?url=login/">Zur&uuml;ck</a><p>';
     echo '</body></html>';
       }
?>

Quelltext der pass.xtx

admin3,test3,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=ortnerreinhard/;
admin2,test2,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=admin1/;
admin3,test3,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=ortnerreinhard/;
dornauerudo,udoeuro,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=dornauerudo/;

Ich finde den Fehler nicht.

Vielen Dank für eure Mühe.

Gruss

Rene

  1. Moin Rene,

    ich habe mit PHP eine einfache Passwortabfrage erstellt. Leider wird anscheinend nur die 1. Zeile der Passwort-Datei ausgelesen.

    // For as long as $i is <= the size of the $line array,
      // explode each array element into a username and password pair

    ist ja interessant. Du hast diese Passwortabfrage erstellt? Kommentierst Du deine Scripte immer in Englisch?

    Grüsse
    Mike

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. HI Mike,

      ich habe Teile von anderen PHP Skripten verwendet, selbst dazu geschustert und alles kombiniert. Mein PHP Kenntnisse sind äh bescheiden und nicht weitreichend.

      Daher ist ein Teil englisch kommentiert. Aber ich habe auch schon PHP Code english kommentiert.

      Gruss

      Rene

  2. ich habe mit PHP eine einfache Passwortabfrage erstellt. Leider wird anscheinend nur die 1. Zeile der Passwort-Datei ausgelesen.

    $filename = "pass.xtx";
      $fp = fopen($filename, "r");
      $file_contents = fread($fp, filesize($filename));
      fclose($fp);

    Da gab es mal irgendwas namens readfile().

    $i = 0;

    while($i <= sizeof($line)) {

    Auch schlechter Stil, für gezählte Schleifen gibt es for.

    $data_pair = explode(",", $line[$i]);

    Hättest Du einfach mal die Schleife näher untersucht oder wenigstens einen Blick in $file_contents geworfen, hättest Du festgestellt, dass sehr wohl alle Zeilen eingelesen werden. Und hättest Du Dir mal angeschaut, was in $data_pair eigentlich drin ist (zum Beispiel mit var_dump()), hättest Du auch nicht fragen müssen, warum man sich nur mit den Daten der ersten Zeile der Passwortdatei einloggen kann.

    Und ich gebe Dir noch einen Tipp: Ruft man die Seite direkt, also ohne Formular auf, erhält man auch Zugang. Das Problem liegt hier in der Unterscheidung von !== (nicht identisch, also Wert und Typ verschieden) und != (nicht gleich, nur Wert verschieden).

    1. Hello,

      Da gab es mal irgendwas namens readfile().

      Geistiger Hohlsinn *gg*
      Er will doch die Passworte nicht an den Client ausliefern!

      Der Fehler steckt in der Art des Explodes().
      Er liest eine Datei als binary stream ein, die Zeilenumbrüche enthält und separiert die Datensätze am Semikolon. Damit steht am Anfang des zweiten, dritten vierten bis nten Satzes ein "\n" oder "\r" oder "\r\n", je nach Betriebssystem, das dort nicht hingehört.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Da gab es mal irgendwas namens readfile().

        Geistiger Hohlsinn *gg*
        Er will doch die Passworte nicht an den Client ausliefern!

        Deshalb schrieb ich "irgendwas".

        Der Fehler steckt in der Art des Explodes().

        Erklärst Du mir jetzt nochmal, was ich gerade versucht habe, ihm nicht allzu kryptisch, aber doch Augenmerk zu etwas Eigeninitiative in Sachen "Grundlagen der Fehlersuche" beizubringen?

        1. Hello,

          Da gab es mal irgendwas namens readfile().

          Geistiger Hohlsinn *gg*
          Er will doch die Passworte nicht an den Client ausliefern!

          Deshalb schrieb ich "irgendwas".

          Der Fehler steckt in der Art des Explodes().

          Erklärst Du mir jetzt nochmal, was ich gerade versucht habe, ihm nicht allzu kryptisch, aber doch Augenmerk zu etwas Eigeninitiative in Sachen "Grundlagen der Fehlersuche" beizubringen?

          Ich sehe darin keinerlei didaktischen Nutzen, jemand eine zusätzlichen Fehler unterzujubeln, wenn er sowieso schon schwimmt. Das kann man machen, wenn jemand jubelt "ich kann alles". Dann kann man auch mal eine solchen Test loslassen.

          Übrigens hat sich das hier bei den PHPlern so eingebürgert, dass man, wenn men eine Funktion benennt, vorher nochmal ins Manual reinschaut, ob man sich nicht selbst geeirrt hat und wenn man dann schon mal in der Seite steht, den Link darauf gleich mitpostet.

          Das hat nichts mit Fualuheit des Fragestellers zu tun. Der ist nämlich in deisem Moment so bussig, dass er sich über jede Erleicherung freut.

          Versuchs doch bitte mal, etwas freundlicher zu werden.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Ich sehe darin keinerlei didaktischen Nutzen, jemand eine zusätzlichen Fehler unterzujubeln, wenn er sowieso schon schwimmt.

            Es war keine Absicht, ich habe mich geirrt, ich hatte keine Lust, dieses Mal nachzuschauen. Bitte untertänigst um Nachsicht und Anerkennung der Anwendbarkeit, vielleicht gar Nützlichkeit der restlichen fünf Sätze.

      2. Hallo Tom,

        Der Fehler steckt in der Art des Explodes().
        Er liest eine Datei als binary stream ein, die Zeilenumbrüche enthält und separiert die Datensätze am Semikolon. Damit steht am Anfang des zweiten, dritten vierten bis nten Satzes ein "\n" oder "\r" oder "\r\n", je nach Betriebssystem, das dort nicht hingehört.

        vielen Dank, ich glaube zu verstehen was du meinst.

        Danke!

        Gruss

        Rene

    2. Hallo,

      Hättest Du einfach mal die Schleife näher untersucht oder wenigstens einen Blick in $file_contents geworfen, hättest Du festgestellt, dass sehr wohl alle Zeilen eingelesen werden. Und hättest Du Dir mal angeschaut, was in $data_pair eigentlich drin ist (zum Beispiel mit var_dump()), hättest Du auch nicht fragen müssen, warum man sich nur mit den Daten der ersten Zeile der Passwortdatei einloggen kann.

      vielen Dank für die Kopfnüsse! (ernst gemeint) :-) Ich werde mir das zu Gemüte führen. Und auch var_dump() angucken.

      Schönen Abend

      Rene

  3. Hello Rene,

    wenn Du Fragen zu PHP stellst, dann ist es doch eigentlich unwichtig, in welcher Farbe der Hintergrund gestaltet wird, oder? Im Interesse einer schnnelen Beantwortung Deiner Fragen solltest Du den Code also in Zukunkt bitte auf das notwenige Minimum reduzieren.

    admin3,test3,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=ortnerreinhard/;
    admin2,test2,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=admin1/;
    admin3,test3,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=ortnerreinhard/;
    dornauerudo,udoeuro,http://www.eurofinanz.co.at/vertriebspartner/jump.php?url=dornauerudo/;

    Du hast also ein CSV-Format, wahrscheinlich auch mit Zeilenumbrüchen am Ende?

    Du willst diese Datei einlesen und in ein Mehrdimensionales Array zerlegen?
      Wenn die Datei auch gelgentlich im Betrieb geändert werden muss, dann musst Du dich um
      Locking kümmern.
      Zum schnellen Einlesen gibt es sonst auch fgetcsv()
      http://de.php.net/manual/en/function.fgetcsv.php
      oder auch file()
      http://de.php.net/manual/en/function.file.php

    Wenn Deine Datei also hinter dem Semikolon Zeilenumbrüche hat:
    (da steckt wahrscheinlich der Fehler versteckt)

    Semikolen am Ende wegnehmen!

    $fh = fopen($dateiname,'r');
    if (!$fh) die('kann Datei nicht öffnen')
    flock($fh,LOCH_SH); ## Nur zum LESEN!
    $_userdata = array();
    while (!feof($fh))
    {
      $_userdata[] = fgetcsv($fh,256,',');  ## die 256 sind dann die maximale Zeilenlänge
                                            ## und beliebig einstellbar
    }

    echo "<pre>";
    print_r($_userdata);
    echo "</re>";

    if(isset($_POST['username']) and (strlen(trim($_POST['username']))>0) and
       isset($_POST['passwort']) and (strlen(trim($_POST['passwort']))>0))
    {
      ## Vergleich durchführen

    }

    Nun musst Du selber weiterkommen.

    Du willst, dass Dein Script auch morgen noch arbeitet?
      dann solltest Du $HTTP_*_VARS nicth mehr verwenden, sondern die neuen "superglobalen"
      Arrays $_POST, $_GET, ... benutzen.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau