Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Eine Passwortdatei zeilenweise überprüfen in einem PHP Script

Empfohlene Antworten

Veröffentlicht

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

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]


...
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.

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

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 ;)

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.

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.

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...

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.

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... ;-)

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:

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...

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 :rolleyes:

EDIT2:

Ich will mich aber hier gar nicht rumstreiten... Ich bin immernoch der Meinung, Explode reicht vollkommen :D

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 :)

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..)

sers

da sind irgendwie die klammern falsch gesetzt.. folgendermaßen solltes klappen

if ($strUser == $arrParts[0] && $strPass == $arrParts[1]) {

......

gruß

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,

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.