Login - Benutzer aus Benutzer.txt auslesen

Florian H.

Grünschnabel
Ich habe ein Login script geschrieben, es funktioniert soweit mit den manuell eingegebenen benutzern (benutzername:salted md5 passwort) aber mit den daten die automatisch von der regestrierung geschrieben wurden nimmt er es nicht(er gibt mir aus das der benutzer nicht gefunden wurde), es muss irgenwas mit absatz bei den einzelnen zeilen im benutzer.txt sein.
die regestrierung schreibt die sachen mit mehr punkten rein (benutzername:salted md5 passwort:vorname:nachname:email).

ich würde mich freuen wenn ihr mir dabei helfen könntet.
 
Hallo Florian,

ohne Code kann man hier nur spekulieren.
Kannst Du uns den Code und die Text-Datei zeigen?

Ich möchte dich bitten, dich an die Groß- und Kleinschreibung und damit an die Netiquette zu halten.

Viele Grüße
goto;
 
Im benutzer.txt funktionieren die ersten 3 Benutzernamen, der 4 wurde Automatisch mit einer Registrierung hinzugefügt. Die die ich manuell Eingegeben habe funktionieren einwandfrei aber beim 4. (dem letzen) sagt er mir das der Benutzer nicht gefunden wurde.

Nutzername und passwort:
jonas.muster - passwort
max.muster - meinpasswort
felix.muster - 25bbs25
sophie321 - 123456

Code:
PHP:
<?php

    $name = (isset($_POST['vname'])) ? $name = strtolower($_POST['vname']) : $name = '';
    $password = (isset($_POST['password'])) ? $password = $_POST['password'] : $password = '';
    $mySalt = '8c1018520e927a524697bdf97d87d873';
   
?>
<?php
    $userFound = false;
    if ($name != '' & $password != '') {
       
        $file = '../txt/benutzer.txt';         //pfad ändern
        $file_handle = fopen($file, 'r');
       
        while (!feof($file_handle)) {
           
            $line = fgets($file_handle);
           
            if ($line != '') {
                $line_name = substr($line, 0, strpos($line,':'));
                $line_password = rtrim(substr($line, strpos($line,':')+1));
                //echo $name . ' -> ' . $line_name . chr(10);
                if ($name == $line_name) {
                    $userFound = true;
                    if (md5($password . $mySalt) == $line_password) {
                        //header ("Location: ../Hauptseite.html");
                        echo '<h1> Sie haben sich Erfolgreich eingeloggt</h1>';
                    } else {
                        echo '<p>Passwort ist inkorrekt</p>';
                    }
                }
            }
        }
       
        fclose($file_handle);
       
        if(!$userFound) {
            echo '<p>Benutzer nicht gefunden!</p>';
        }
    }
?>

Der HTML Code den ich als Login Felder verwende:
HTML:
<html>
<head>
</head>
<body>
<form method="post" action="index.php">
      <label for="vname">Benutzername:
        <input type="text" id="vname" name="vname" placeholder="Benutzername">
      </label>
      <label for="passwort"> Passwort:
        <input type="password" id="password" name="password" placeholder="Passwort">
      </label>
      <input type="submit" value="senden">
    </form>
</body>
</html>
 

Anhänge

  • benutzer.txt
    216 Bytes · Aufrufe: 2
Danke für diesen lösungs Ansatz aber ich werde das Script umschreiben und jeden Benutzer einzeln in einer Datei anlegen (Benutzernamen als Datei namen)
 
Hi

auch wenn das hier schon als gelöst markiert wurde:
a) Bitte, weg mit MD5. Es ist viel zu schwach für die heutige Zeit. Siehe PBDKF2 oder bcrypt.
b) Mit allen Usern in einer Datei bekommst du ein Problem, wenn deine Seite so gut besucht ist, dass zwei oder mehr User die PHP-Datei gleichzeitig ausführen. (Speziell wenns ums registrieren/schreiben geht, wegen dem Schreiben selber, und wegen der Kontrolle obs den User schon gibt, und ...). Stichworte: Datenbanken, und Unique und/oder Transactions.
c) Mit einer Datei pro User, mit dem Benutzernamen als Dateiname, hast du (eventuell) ein Sicherheitsproblem: Wie wäre zB. ein Benutzername /etc/passwd ? (auf Linux die Datei mit den Systemaccounts). Deswegen, zumindest bestimmte Zeichen nicht erlauben, wie / und \, oder besser gleich den Hexwert nehmen. Im Übrigen bleibt das Problem mit den Raceconditions beim Registrieren: Zuerst prüfen obs den Namen schon gibt, aha gibts nicht, dann anlegen. Und was ist, wenn zwischen den zwei Schritten schon wer anderer angelegt hat?
 
Hi

auch wenn das hier schon als gelöst markiert wurde:
a) Bitte, weg mit MD5. Es ist viel zu schwach für die heutige Zeit. Siehe PBDKF2 oder bcrypt.
b) Mit allen Usern in einer Datei bekommst du ein Problem, wenn deine Seite so gut besucht ist, dass zwei oder mehr User die PHP-Datei gleichzeitig ausführen. (Speziell wenns ums registrieren/schreiben geht, wegen dem Schreiben selber, und wegen der Kontrolle obs den User schon gibt, und ...). Stichworte: Datenbanken, und Unique und/oder Transactions.
c) Mit einer Datei pro User, mit dem Benutzernamen als Dateiname, hast du (eventuell) ein Sicherheitsproblem: Wie wäre zB. ein Benutzername /etc/passwd ? (auf Linux die Datei mit den Systemaccounts). Deswegen, zumindest bestimmte Zeichen nicht erlauben, wie / und \, oder besser gleich den Hexwert nehmen. Im Übrigen bleibt das Problem mit den Raceconditions beim Registrieren: Zuerst prüfen obs den Namen schon gibt, aha gibts nicht, dann anlegen. Und was ist, wenn zwischen den zwei Schritten schon wer anderer angelegt hat?

Ich beschäftige mich damit noch nicht wirklich lange, deswegen hab ich den md5 schwächer gemacht weil dies erstmal zu Test zwäcken dient und zudem bin ich lange nicht fertig, das was sie aufgezählt haben hatte ich bereits im Hinterkopf und werde dies auch versuchen umzusetzen sobald die Zeit dazu gekommen ist und der Rest soweit einwandfrei und verlässlich funktioniert

lg
 
deswegen hab ich den md5 schwächer gemacht weil dies erstmal zu Test zwäcken dient
Versteh ich leider nicht. Beides ist in PHP nur eine Zeile, das kann man auch beim ersten Entwurf schon richtig machen.

das was sie aufgezählt haben hatte ich bereits im Hinterkopf und werde dies auch versuchen umzusetzen sobald die Zeit dazu gekommen ist und der Rest soweit einwandfrei und verlässlich funktioniert
Die DB-Sache wird aber fast alles in deinem derzeitigen Code sinnlos machen... du programmierst da praktisch zwei Mal das Selbe, nur einmal mit bekannten Problemen. (...na gut?)
 
Zurück