Loginfunktion

esdesign

Grafikdesigner
Hallo liebe Forengemeinde,

Ich bin gerade dabei eine Loginfunktion zu programmieren, welche schon sicher sein sollte. Hier der Login, habt Ihr da noch ne Idee, was sicherer werden sollte****?

PHP:
<?php
//***********************************************************//
//***** Loginsystem, login.php ***********************************//
//***********************************************************//

    if(isset($_POST['benutzer']) {
      if(isset($_POST['passwort']) {
        $benutzer = mysql_real_escape_string($_POST['benutzer']);
        $benutzer = md5($benutzer);
        
        $passwort = mysql_real_escape_string($_POST['passwort']);
        $passwort = md5($passwort);
        
        $query['benutzerabfrage'] = mysql_query('SELECT benutzer, passwort, name FROM com_Benutzer WHERE 
                                                 benutzer LIKE '.$benutzer.' AND 
                                                 passwort LIKE '.$passwort.'');
        $result = mysql_fetch_assoc($query['benutzerabfrage']);
        
        if (mysql_num_rows($query['benutzerabfrage']) == 1)
        {
            $ipadresse = getenv("REMOTE_ADDR"); //IP-ADRESSE auslesen
            $ipadresse = mysql_real_escape_string($ipadresse); //IP-ADRESSE ESCAPEN und SPEICHERN
            
            $log['lognumber'] = $benutzer.$passwort.$date; //DIE SESSION DES NUTZERS
            $log['lognumber'] = mysql_real_escape_string($log['lognumber']); //DIE SESSION DES NUTZERS

            $log['datei'] = fopen("log/".$benutzer, "a+");
            $log['datei_fuellen'] = fWrite($log['datei'] , 'Benutzer '.$name.' hat sich am '.$date.' mit der IP-Adresse '.$ipadresse.' angemeldet.\n');
            
            $query['einloggen'] = mysql_query('UPDATE com_Benutzer SET login = '.$log['lognumber'].' WHERE benutzer = '.$benutzer.'');
            $query['einloggen'] = mysql_query('INSERT INTO com_Benutzer_Log ("ipadresse", "lognummer") VALUES ('.$ipadresse.', '.$log['lognumber'].')');
            
            setcookie('com_Benutzer1', $benutzer, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Benutzernamen speichern
            setcookie('com_Benutzer2', $name, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Namen speichern
        }
        else
        {
            Header('Location: index.php?login=false');
        }
      }
    }
?>

Für Tipps wäre ich dankbar...

Eike
 
Hi,

Wenn du den Benutzernamen und das Passwort mit md5 hashst, dann brauchst du diese nicht vorher mit mysql_real_escape_string() escapen, das verfälscht nur den Hash.

Die IP-Adresse brauchst du auch nicht escapen, die kann der Benutzer nicht manipulieren, bzw. in nichts gefährliches umwandeln.

Warum speicherst du in der Logtabelle com_Benutzer auch das gehashte Passwort?

In der ersten DB-Abfrage würde ich das LIKE durch ein "=" austauschen, der Hash muss exakt stimmen.

Ansonten hab ich nichts anzumeckern ;)

Gruß
BK
 
PHP:
<?php
//***********************************************************//
//***** Loginsystem, login.php ***********************************//
//***********************************************************//

    if(isset($_POST['benutzer']) {
      if(isset($_POST['passwort']) {

        $benutzer = md5($benutzer);
        $passwort = md5($passwort);
        
        $query['benutzerabfrage'] = mysql_query('SELECT benutzer, passwort, name FROM com_Benutzer WHERE 
                                                 benutzer = '.$benutzer.' AND 
                                                 passwort = '.$passwort.'');
        $result = mysql_fetch_assoc($query['benutzerabfrage']);
        
        if (mysql_num_rows($query['benutzerabfrage']) == 1)
        {
            $ipadresse = getenv("REMOTE_ADDR"); //IP-ADRESSE auslesen
            
            $log['lognumber'] = $benutzer.$date; //DIE SESSION DES NUTZERS
            $log['lognumber'] = mysql_real_escape_string($log['lognumber']); //DIE SESSION DES NUTZERS

            $log['datei'] = fopen("log/".$benutzer, "a+");
            $log['datei_fuellen'] = fWrite($log['datei'] , 'Benutzer '.$name.' hat sich am '.$date.' mit der IP-Adresse '.$ipadresse.' angemeldet.\n');
            
            $query['einloggen'] = mysql_query('UPDATE com_Benutzer SET login = '.$log['lognumber'].' WHERE benutzer = '.$benutzer.'');
            $query['einloggen'] = mysql_query('INSERT INTO com_Benutzer_Log ("ipadresse", "lognummer") VALUES ('.$ipadresse.', '.$log['lognumber'].')');
            
            setcookie('com_Benutzer1', $benutzer, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Benutzernamen speichern
            setcookie('com_Benutzer2', $name, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Namen speichern
        }
        else
        {
            Header('Location: index.php?login=false');
        }
      }
    }
?>

Da hast Du natürlich recht, dass der Hash exat stimmen muss. Ich glaube, dass es an sonsten so bleiben kann... oder?

Ich habe nun auch das script für die Überprüfung, ob der Nutzer (noch) eingeloggt ist fertig! Dieses sieht so aus:

PHP:
<?php

	if(!isset($_COOKIE['com_benutzer1)) die ("Sie haben keine Berechtigung, diese Seite zu öffnen.<br>Loggen Sie sich bitte erneut ein.");

?>

LG, Eike
 
Hi,

ein einfaches "die()" ist ziemlich unhöflich und sieht auch nicht gut aus. Ich würde eher eine Weiterleitung auf eine spezielle Seite, die ins Layout passt, bevorzugen.

Und noch ein Tip: Nach jeder Weiterleitung per header() schreibe ein die(). Sonst läuft das Script noch fertig, bevor die Weiterleitung erfolgt, was nur selten beabsichtigt ist.

Gruß
BK
 
Grundsätzlich leite ich auch auf eine ander Seite weiter, allerdings ist dieses hier nicht notwendig! Denn das Script wird in einer schon fertigen Seite angezeigt:

PHP:
<?php
         get_head();
              get_script();  // Es wird per GET überprüft, welches Script geladen werden soll!
         get_footer():
?>

Trotzdem danke!
 
Heyyy...

Du meinst das sicherlich so:

PHP:
<?php
//***********************************************************//
//***** Loginsystem, login.php ***********************************//
//***********************************************************//

    if(isset($_POST['benutzer']) {
      if(isset($_POST['passwort']) {

        $benutzer = md5($benutzer);
        $passwort = md5(CONCAT('$passwort', salt);
        
        $query['benutzerabfrage'] = mysql_query('SELECT benutzer, passwort, name FROM com_Benutzer WHERE 
                                                 benutzer = '.$benutzer.' AND 
                                                 passwort = '.$passwort.'');
        $result = mysql_fetch_assoc($query['benutzerabfrage']);
        
        if (mysql_num_rows($query['benutzerabfrage']) == 1)
        {
            $ipadresse = getenv("REMOTE_ADDR"); //IP-ADRESSE auslesen
            
            $log['lognumber'] = $benutzer.$date; //DIE SESSION DES NUTZERS
            $log['lognumber'] = mysql_real_escape_string($log['lognumber']); //DIE SESSION DES NUTZERS

            $log['datei'] = fopen("log/".$benutzer, "a+");
            $log['datei_fuellen'] = fWrite($log['datei'] , 'Benutzer '.$name.' hat sich am '.$date.' mit der IP-Adresse '.$ipadresse.' angemeldet.\n');
            
            $query['einloggen'] = mysql_query('UPDATE com_Benutzer SET login = '.$log['lognumber'].' WHERE benutzer = '.$benutzer.'');
            $query['einloggen'] = mysql_query('INSERT INTO com_Benutzer_Log ("ipadresse", "lognummer") VALUES ('.$ipadresse.', '.$log['lognumber'].')');
            
            setcookie('com_Benutzer1', $benutzer, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Benutzernamen speichern
            setcookie('com_Benutzer2', $name, time()+3600); //COOKIE SETZEN, 1 STUNDE GÜLTIG, Namen speichern
        }
        else
        {
            Header('Location: index.php?login=false');
        }
      }
    }
?>

Nun habe ich noch nicht ganz verstanden, was salt eigendlich genau macht! Und was ich in die salt Spalte schreibe!

Eike
 
Auch wenn der Thread doch etwas alt ist habe ich doch eine Frage.
Bin gerade selbst dabei einen Login zu schreiben und hänge an einer Stelle.
Und zwar ist das bei mir so, es werden alle Daten des Users überprüft und soabld alles richtig ist kommt ein Text "Bla bla Danke für die anmeldung".
Soweit so gut, bis dahin geht alles. Doch jetzt habe ich das Problem mit den Cookies. Die können ja normal nur gaaanz am Anfang der Seite gesetzt werden. Hier sehe ich die Cookies allerdings mitten im Code. Habe ich mich da geirrt oder hat esdisign was falsch gemacht.

Für Tipps wäre ich sehr glücklich. Habe auch schon überlegt einfach eine Weiterleitung einzubaun, doch diese muss laut PHP.net ja auch vor jeglichen Quellcode.

Für Hilfe wäre ich sehr dankbar.
mfg Noxum


EDIT: Okey hab es einfach mal getestet indem ich den Cookie mitten im Code anlege, danach habe ich beim FireFox in der Cookie verwaltung gesucht und tada, da war er. Für eine Erklärung wäre ich trozdem froh :)
 
Zuletzt bearbeitet:
Cookies kannst du überall anlegen mit einer Voraussetzung, es darf vorher keine Ausgabe zum Client erfolgen. Sonst ist der header bereits gesetzt und es wird eine Fehlermeldung ausgegeben.
 
Hat mir ein Kollege jetzt auch gesagt. Trozdem vielen Dank für deine Auskunpft.
Mich hat halt der Hinweis auf php.net irritiert, dachte es dürfte echt garnichts vor dem setzten kommen. Aber jetzt weiß ich es zum Glück besser.

Nochmal danke.
mfg Noxum
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück