Zum Inhalt springen

Eine Passwortdatei zeilenweise überprüfen in einem PHP Script


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...