Phade Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 Hallo Artgenossen, ich sitze hier in einer Sackgasse mit einem PHP Problem. Und zwar möchte ich, dass, wenn ich ein Passwort eingebe, in die Datei namen_pw.txt geguckt wird, ob der Username und das Passwort darin enthalten sind. Zur Zeit habe ich folgenden Code aus diversen Schnipseln aus dem Netz zusammen "gehauen" . <?php //Variablendeklaration fuer Namenspruefung $name1 = "User1, passwrd1"; $name2 = "User2, passwrd2"; $name3 = "User3, passwrd3"; //Passwortueberpruefung durch nachschlagen in einer Textdatei //Hier wird die Datei namen_pw.txt geoefnent und gelesen $datei = fopen("namen_pw.txt", "r") or die ("Kann Passwortdatei nicht ferifizieren!"); if ($datei) { while (!feof($datei)) { $buffer = fgets($datei, 4096); echo $buffer; } fclose($datei); } ?> [/PHP] Das was ich nun wissen möchte ist, wie und wo ich die eigentliche Überprüfung des Users und des Passworts einbauen müsste/könnte/sollte? Ich würde es aus meiner sicht in die while-Schleife unter $buffer packen, da ja im buffer die Informationen stehen. Da ist ja das zweite Problem, denn im buffer stehen ALLE Informationen. Nicht nur die erste Zeile so wie ich es gern hätte. Ach ja, die Informationen in der namen_pw.txt sind wie folgt eingetragen: [code] User1, passwrd1 User2, passwrd2 User3, passwrd3 [/code] Wenn jemand eine Idee hat, immer raus damit! Über eine Anregung würde ich mich natürlich auch freuen. Im voraus thanx Zitieren
Monty82 Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 Hier die Anregung Ist dafür allerdings trocken geschrieben, und nicht getestet... <?php $strUser = $_REQUEST['username']; $strPass = $_REQUEST['password']; $bAuthentificated = false; $resFile = fopen('namen_pw.txt','r'); while ($resFile && !feof($resFile) && !$bAuthentificated) { $strLine = fgets($resFile); if (preg_match('/^([^,]+), (.*)$/is',$strLine,$arrPregRes)) { if ($strUser == trim($arrPregRes[1]) && $strPass == trim($arrPregRes[2])) { $bAuthentificated = true; } } } if ($resFile) fclose($resFile); if ($bAuthentificated) { //User allowed to access... } else { //Access denied... } ?> [/PHP] Zitieren
geloescht_JesterDay Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 ... while (!feof($datei)) { $buffer = fgets($datei, 4096); $user = explode(", ",$buffer); ... [/php] fgets liest immer eine Zeile der Textdatei ein (in die variable $buffer). explode Teilt den String (eine Zeile aus der Datei) und zwar am mitgegebenen Zeichen (", "). Danach steht im Array $user an der Stelle 0 ($user[0]) der benutzername und an der Stelle 1 ($user[1]) das PW. Zitieren
Phade Geschrieben 27. Oktober 2006 Autor Geschrieben 27. Oktober 2006 Moin Moin, erstmal danke für die "Anregungen" Ich habe mich mal für die erste entschieden und in mein Script eingebaut. Allerdings, wenn ich nun das Anmeldeformular ausführe sagt mir das php-Script das es das pw nicht ferifizieren konnte.... Hier mal mein kompletes Script: <?php $strUser = $_REQUEST['username']; $strPass = $_REQUEST['password']; $bAuthentificated = false; $resFile = fopen('namen_pw.txt', 'r'); while ($resFIle && !feof($resFile) && !$bAuthentificated) { $strLine = fgets($resFile); if (preg_match('/^([^,]+), (.*)$/is', $strLine, $strarrPregRes)) { if ($strUser == trim($arrPregRes[1]) && $strPass == trim($arrPregRes[2])) { $bAuthentificated = true; } } } if ($resFile) { fclose($resFile); } if ($bAuthentificated) { echo "<b>Passwort wurde Ferifiziert!</b>"; } else { echo "<b>Passwort konnte nicht Ferifiziert werden</b>"; } ?> [/PHP] Hab ich etwas übersehen oder vergessen ??? Die Passwörter stehen nachwievor username, pw in der namen_pw.txt thx Zitieren
Monty82 Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 Zuerstmal aus '$resFIle' -> '$resFile' machen Und dann kannst Du ja mal zum Debuggen ein paar Ausgaben einbauen: ... echo 'PW Parameter: '.$strPass.'<br>'; echo 'User Parameter: '.$strUser.'<br>'; echo 'PW Datei: '.trim($arrPregRes[2]).'<br>'; echo 'User Datei: '.trim($arrPregRes[1]).'<br>'; echo '<hr>'; if ($strUser == trim($arrPregRes[1]) && $strPass == trim($arrPregRes[2])) ... [/PHP] Achja, und bitte [b]v[/b]erifiziert Zitieren
geloescht_JesterDay Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 1. heißt es verifiziert 2. ist ein explode um einiges schneller als preg_match. Da man hier keine RegExp Funktionalität braucht, sollte man auch nicht eine RegExp nehmen, auch wenn sie schön kompliziert aussieht 3. ist die RegExp '/^([^,]+), (.*)$/is' IMHO eh bissl komisch /^(\w+),\s(\w+)$/ sollte dasselbe tun. In der obigen wird alles bis zu einem Komma gesucht, was kein Komma enthalten darf :confused: Meine sucht ein Wort, gefolgt von einem Komma, gefolgt von Whitespace (leerzeichen) und am Ende wieder ein Wort. Dabei werden die beiden gefundenen Worte wiederum als Auswahl zurückgegeben. Hm, \w schließt keine Sonderzeichen mit ein... /^(.*),\s(.*)$/ sollte aber das gleiche tun. Zitieren
Grandmasta Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 wieso machst das ganze nicht über eine datenbank? ist doch viel einfacher. du solltest bei der txt datei auch bedenken, dass du die dateirechte änderst oder die datei in ein verzeichnis verschiebst, auf das andere keinen zugriff haben. sonst kann ja jeder, der den dateinamen kennt, sich alle passwörter anzeigen lassen. Zitieren
Phade Geschrieben 27. Oktober 2006 Autor Geschrieben 27. Oktober 2006 wieso machst das ganze nicht über eine datenbank? ist doch viel einfacher... Weil ich, ich denke du meinst SQL, da noch keinerlei Erfahrung habe... Ich habe jetzt die Zeile ... if (preg_match('/^(\w+),\s(\w+)$/',$strLine,$arrPregRes)) { if ($strUser == trim($arrPregRes[1]) && $strPass == trim($arrPregRes[2])) { $bAuthentificated = true; } } ... [/PHP] geändert. Allerding kann er das PW noch immer nicht verifizieren.... Verstehe ich da etwas nicht, oder übersehe ich eine Kleinigkeit... Zitieren
geloescht_JesterDay Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 Weil ich, ich denke du meinst SQL, da noch keinerlei Erfahrung habe... Dann wäre es doch an der Zeit, da Erfahrungen zu sammeln Ich verstehe auch nicht, warum du so auf den regulären Ausdrücken rumreitest. Mit dem explode geht es einfacher und schneller. Der Einwand von Grandmasta ist aber durchaus berechtigt. Eine Textdatei kann mit dem Browser einfach so abgerufen werden. Der Webserver braucht ja Zugriff. Also entweder außerhalb des Webpfades ablegen oder dein ganzes Vorgehen abändern. Zitieren
Phade Geschrieben 27. Oktober 2006 Autor Geschrieben 27. Oktober 2006 Zuerstmal aus '$resFIle' -> '$resFile' machen Und dann kannst Du ja mal zum Debuggen ein paar Ausgaben einbauen: ... echo 'PW Parameter: '.$strPass.'<br>'; echo 'User Parameter: '.$strUser.'<br>'; echo 'PW Datei: '.trim($arrPregRes[2]).'<br>'; echo 'User Datei: '.trim($arrPregRes[1]).'<br>'; echo '<hr>'; if ($strUser == trim($arrPregRes[1]) && $strPass == trim($arrPregRes[2])) ... [/PHP] Achja, und bitte [b]v[/b]erifiziert Habe ich jetzt mal gemacht und ich hab folgendes festgestell: [code] Anmeldebestaetigung Passwort //Überschrift PW Parameter: falli06 User Parameter: PW Datei: Radditz User Datei: Radditz, lkwpeter --------------------------------------------------------------------------Passwort konnte nicht Ferifiziert werden //PHP Meldung [/code] So sieht die Browserausgabe aus. Dazu folgendes: PW Parameter: ist mein PW in der Übung User Parameter: hier müsste doch mein Username stehen oder? PW Datei: ?? Dies ist der dritte Username der in der .txt-Datei steht... Userdatei: ist die ganze Zeile des dritten Users aust der Datei... Aus meiner Sicht etwas merkwürdig.... Ich werde das Ferifiziert in Verifiziert ändern... ;-) Zitieren
Phade Geschrieben 27. Oktober 2006 Autor Geschrieben 27. Oktober 2006 Dann wäre es doch an der Zeit, da Erfahrungen zu sammeln ... Hmm...dann würde ich jetzt fragen müssen wie ich das in SQL umsetze... Da ich halt keinerlei Befehle von SQL kenne...habe aber im XAMPP-Controlle SQL gestartet....:floet: Zitieren
Monty82 Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 2. ist ein explode um einiges schneller als preg_match. Da man hier keine RegExp Funktionalität braucht, sollte man auch nicht eine RegExp nehmen, auch wenn sie schön kompliziert aussieht Das schon, aber wenn man Benutzer nachher ihr Passwort selber ändern lässt, gibt es da bestimmt ein paar Spezialisten, die ein Komma verwenden wollen... Und dann müsstest Du die Explode-Teile hinter dem Username wieder zusammenfügen. Dann wäre sicherlich strpos und substr angebrachter. 3. ist die RegExp '/^([^,]+), (.*)$/is' IMHO eh bissl komisch Was bitte daran ist komisch? Es wird hier alles bis zu einem Komma gesucht, was selbst kein Komma ist... /^(.*),\s(.*)$/ sollte aber das gleiche tun. Nein, denn sollte jemand ein Passwort verwenden, das ', ' enthält, dann würde der Benutzername bis zu dieser Stelle gelten, da der Ausdruck standardmäßig "gierig" gesucht wird... Zitieren
geloescht_JesterDay Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 Das schon, aber wenn man Benutzer nachher ihr Passwort selber ändern lässt, gibt es da bestimmt ein paar Spezialisten, die ein Komma verwenden wollen... Und dann müsstest Du die Explode-Teile hinter dem Username wieder Ein ", " (Komma gefolgt von einem Leerzeichen), da muss man schon ein großer Spezialist sein. Außerdem kann man das bei der Änderung abfangen. Was bitte daran ist komisch? Es wird hier alles bis zu einem Komma gesucht, was selbst kein Komma ist... Deine RegExp sucht alles bis zu einem Komma gefolgt von einem Leerzeichen. Wenn das Komma + Leerzeichen der Trenner ist, wieso musst du dann vorher ein Komma explizit ausschließen? Und wenn man ein Komma im Namen verbieten will, dann sollte man so einen Namen gar nicht erst zulassen. Nichts ist schlechter, als einen Namen anzulegen, den dann aber nicht prüfen zu können Ein Komma gefolgt von einem Leerzeichen wird in wenigen Namen und Passwörtern vorkommen und das sollte eh beim Anlegen (wenn der Nutzer es selbst tun darf) geprüft werden. EDIT: zu meiner RegExp: ein kleines u am Ende als Selektor und deine Einwand ist erledigt. Außerdem war das genauso wie dein erster Beitrag einfach mal ins blaue geschrieben EDIT2: Ich will mich aber hier gar nicht rumstreiten... Ich bin immernoch der Meinung, Explode reicht vollkommen Zitieren
Monty82 Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 Ein ", " (Komma gefolgt von einem Leerzeichen), da muss man schon ein großer Spezialist sein. Außerdem kann man das bei der Änderung abfangen. Bei Endbenutzern kann man nie vorsichtig genug sein Deine RegExp sucht alles bis zu einem Komma gefolgt von einem Leerzeichen. Wenn das Komma + Leerzeichen der Trenner ist, wieso musst du dann vorher ein Komma explizit ausschließen? Weil sonst bei einem ', ' im Passwort wieder das gleiche Problem des "gierigen" Ausdruckes zuträfe. Naja, man könnte auch "nicht gierig" suchen lassen. Aber ich bin dafür, dass wir die Diskussion hier stoppen, da sie off topic ist, und dem Fragesteller nicht hilft. In der Hoffnung, dass Benutzernamen und Passwörter ausreichend validiert werden --> ... while ($resFile && !feof($resFile) && !$bAuthentificated) { $strLine = fgets($resFile); $arrParts = explode(', ',$strLine); if (is_Array($arrParts) && count($arrParts) == 2) { if ($strUser == $arrParts[0]) && $strPass == $arrParts[1])) { $bAuthentificated = true; } } } ... [/PHP] zu Edit2: Jop, seh ich auch so Zitieren
Phade Geschrieben 27. Oktober 2006 Autor Geschrieben 27. Oktober 2006 Ich habe jetzt mal diese while-Schleife probiert und bekomme folgende Meldung im Browser: Parse error: parse error, unexpected T_BOOLEAN_AND in E:\XAMPP\xampp\htdocs\php_form_auth.php on line 28 Das ist die Zeile: if ($strUser == $arrParts[0]) && $strPass == $arrParts[1])) { $bAuthentificated = true; } Ich verstehe jetzt gerade nicht, was der Parser von mir möchte... (Blöd jetzt..) Zitieren
Monty82 Geschrieben 27. Oktober 2006 Geschrieben 27. Oktober 2006 ... if ($strUser == $arrParts[0] && $strPass == $arrParts[1]) ... [/PHP] Zitieren
`kiko Geschrieben 30. Oktober 2006 Geschrieben 30. Oktober 2006 sers da sind irgendwie die klammern falsch gesetzt.. folgendermaßen solltes klappen if ($strUser == $arrParts[0] && $strPass == $arrParts[1]) { ...... gruß Zitieren
Phade Geschrieben 3. November 2006 Autor Geschrieben 3. November 2006 Moin Moin, so, ersteinmal - Danke - für eure Tips und Hilfestellungen. Habe nun in den letzten Tagen daran herumgewerkelt, mir die nächte um die Ohren gehauen und zu guter letzt eine Lösung gefunden. Nochmal danke! Thx, Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.