problem mit Login mit Hilfe von PHP und mySQL

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Login-System/Security

    Hallo,
    ich hatte ein Login-System benötigt, daher stiess ich hier zunächst auf das Login-Tutorial von mrhappiness. Daran gefiel es mir aber nicht, das durch die Sessions nach einem schliessen der Seite man beim nächsten Öffnen automatisch als ausgeloggt gilt. Daher wollte ich das ganze auf Cookies umbaun, was ich auch ohne Probleme geschafft habe, nur wollte ich kurz wissen, ob es auch von der Security richtig ist, wie ich es gemacht habe, da ich ungern irgendwelche Sicherheitslücken im Login-System haben möchte.
    Also hier der Auszug der Funktionen:

    PHP-Code:
    //$db_zugriff aufgrund der MySQL-Klasse globalisiert
    /*
    Das im Formular angegebene Passwort wird bereits mit md5 verschlüsselt an die Funktion übergeben - liegt natürlich in selber Form in der Datenbank vor...
    */
    function check_user($name,$pass){ 
    global 
    $db_zugriff;
    $result $db_zugriff->query_first("SELECT userpasswort FROM users WHERE usernick = '".$name."'");
    if(
    $pass == $result[0]) return '1';
    else return 
    '0';


    /*
    Cookies mit usernick und verschlüsseltem Passwort werden gesetzt, auf die Dauer von einem Jahr - sollte reichen
    */
    function login($usernick,$userpass){ 
    setcookie("dba_usernick""$usernick"time()+(3600*24*365));
    setcookie("dba_userpass""$userpass"time()+(3600*24*365));


    /*
    Es wird überprüft, ob die Cookies gesetzt sind - falls ja ob die Daten auch stimmen...
    */
    function logged_in(){ 
    if(isset(
    $_COOKIE['dba_usernick']) && isset($_COOKIE['dba_userpass'])){
    if(
    check_user($_COOKIE['dba_usernick'],$_COOKIE['dba_userpass']) == "1") return '1';
    else return 
    '0';
    }else return 
    '0';


    /*
    Die Cookies werden durch den Logout wieder zurückgesetzt...
    */
    function logout(){ 
    setcookie("dba_usernick");
    setcookie("dba_userpass");


    /*
    Falls ein User eingeloggt ist wird die $username mit seinem Nick definiert, ansonsten ist sie leer - der User ein Gast
    */
    if(logged_in() == "1"){
    $username $_COOKIE['dba_usernick'];
    }else 
    $username ""
    Also das waren die zentralen Funktionen...könnte es da irgendwelche Probleme mit der Security geben oder kann ich das System guten Gewissens für meine HP benutzen?

    Kommentar


    • OK, kein Problem. Hab es auch auf Cookies basierend geschafft, nur will ich nochmal auf Nummer sicher gehen, ob es von der Security auch sicher ist, daher hab ich dazu nochmal einen Thread eröffnet [hier]

      Kommentar


      • ich führe mal zusammen, weil es ja doch zu diesem thema hier hergehört.
        ausserdem kann happy so auch schneller sehen, dass du was gepostest hast.

        *ZUSAMMENFÜHR*
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • OK, kein Problem, ich dachte nur das ich ein neues eröffnen sollte, weil das Script ja auf Sessions basiert und nicht auf Cookies und weil mrhappiness sagte, das ich Fragen zu Cookies nicht hier posten sollte, aber nungut. Das wichtigste ist, dass ich eine Antwort bekomme, weil mir die Security natürlich sehr wichtig ist. So far...

          Kommentar


          • ich dachte eigentlich, dass du die cookies zusätzlich einbaust und nicht gänzlich auf sessions verzichtest...
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • Zu welchem Zweck wären denn Sessions dann noch nützlich?

              Kommentar


              • damit du 1. die wahl hast zu wechseln und 2. und das cookie nur dann zu nutzen, um den user auf dauer zu identifizieren.

                die session sollte weiterhin genutzt werden, um die daten bei user-aktionen auf der seite selbst zu speichern.

                im cookie sollten nur daten enthalten sein, um den user später wieder automatisch anzumelden. mehr nicht.
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • Achso, dann werd ich die Sessions wohl auch wieder zusätzlich noch einbaun, auch wenn ich nicht ganz verstehe, was du mit "damit du die Wahl hast zu wechseln" meinst...
                  Achja, nur zur mal so: Wenn ich die Sessions wieder einbaue, dann ist das einzige was ich ändern muss wieder der session_start() am Anfang, beim Login das updaten der User-Table mit usersession=session_id() und beim Logout das updaten der Session auf den Standart-Wert (NULL), richtig?
                  Zuletzt geändert von KTJ; 20.08.2003, 21:08.

                  Kommentar


                  • beim prüfen ob er eingeloggt ist,musst du erst nach ner gültigen session suchen und wenn du die nicht findest suchst du nach nem evtl. vorhandenen cookie mit logindaten

                    hat u. a. den vorteil, dass du nicht zwingend auf cookies angewiesen bist und so niemanden ausschließt. wer will kann natürlich trotzdem einen keks haben
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • Achso, hat zwar lange gedauert, aber langsam verstehe ich den Sinn der Sessions nun doch

                      Also gut, wie steht es darum:

                      PHP-Code:
                      function check_user($name,$pass){ 
                      global 
                      $db_zugriff;
                      $result $db_zugriff->query_first("SELECT userpasswort FROM users WHERE usernick = '".$name."'");
                      if(
                      $pass == $result[0]) return '1';
                      else return 
                      '0';


                      function 
                      login($usernick,$userpass){ 
                      global 
                      $db_zugriff;
                      setcookie("dba_usernick""$usernick"time()+(3600*24*365));
                      setcookie("dba_userpass""$userpass"time()+(3600*24*365));
                      $db_zugriff->query("UPDATE users SET usersession='".session_id()."' WHERE usernick = '".$usernick."'"); 


                      function 
                      logged_in(){ 
                      global 
                      $db_zugriff;
                      $result $db_zugriff->query("SELECT usernick FROM users WHERE usersession = '".session_id()."' LIMIT 1");
                      $found mysql_num_rows($result);
                      if(
                      $found == "0"){
                      if(isset(
                      $_COOKIE['dba_usernick']) && isset($_COOKIE['dba_userpass'])){
                      if(
                      check_user($_COOKIE['dba_usernick'],$_COOKIE['dba_userpass']) == "1") return '1';
                      else return 
                      '0';
                      }else return 
                      '0';
                      }elseif(
                      $found == "1") return '1';


                      function 
                      logout(){ 
                      global 
                      $db_zugriff;
                      setcookie("dba_usernick");
                      setcookie("dba_userpass");
                      $db_zugriff->query("UPDATE users SET usersession=NULL WHERE usersession = '".session_id()."'");


                      if(
                      logged_in() == "1"){ 
                      $username $_COOKIE['dba_usernick'];
                      $result $db_zugriff->query_first("SELECT usergroup FROM users WHERE usernick = '".$username."'");
                      $usergroup $result[0];
                      }else 
                      $username ""
                      Ist die Session/Cookie Combo so gut?

                      Nebenbei: Mir ist aufgefallen, dass beim Login beim Usernamen nicht auf Groß- und Kleinschreibung geachtet wird. Soll heissen: Wenn ich mich unter 'KTJ' anmelde, der Name auch so in der Datenbank gespeichert wird, dann kann ich mich trotzdem unter 'kTj' und Passwort, 'ktJ' und Passwort usw. einloggen...beim Passwort allerdings ist dies nicht der Fall. Das liegt denke ich daran, dass es mit md5() verschlüsselt ist und die Verschlüsslung auf Groß- und Kleinschreibung eingeht. Nur möchte ich nicht den Usernamen auch erst verschlüsseln, da es dazu keine weitere Bewandnis gibt. Also gibt es auch eine andere Möglichkeit?

                      Kommentar


                      • sieht auf den ersten blick nich schlecht aus *g*

                        wie prüfst du die login-daten beim ersten einloggen, die kommen ja von nem formular oder?

                        was großKLEINschreibung angeht: SELECT BINARY username könnte helfen (beim abprüfen in der where-bedingung auch)
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • Gut, ich hoffe das ich alles relevante für Sessions und Cookies drinn habe, aber gehen tut es auf jeden Fall schonmal einwandfrei...
                          Wegen dem ersten Einloggen: Ich hab es so gemacht, dass auf der Seite dann in der Navigation entweder eine Login-Box erscheint wenn man nicht eingeloggt ist oder eben ein Link zum Ausloggen usw. wenn man eingeloggt ist. Bei der Login-Box wird natürlich alles über ein Formular geschickt. Und zu Beginn der Anmeldung werde ich es vorraussichtlich so einbaun, das man sich nicht selbst ein Passwort "aussuchen" kann, sondern ein zufällig generiertes an die bei der Registrierung angegebene Mail-Adresse bekommt...so kann man zumindestens sicher gehen, dass die Mail-Adresse gültig ist und das Passwort kann man dann natürlich später nach belieben ändern.
                          Das mit dem SELECT BINARY werde ich dann morgen mal ausprobieren, Rückantwort folgt dann.

                          Kommentar


                          • wenn du da aber auch check_user nimmst um die eingaben zu prüfen, müsste der benutzer dann nicht die md5-verschlüsselung seines passworts angeben?
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • Also erstmal wegen dem BINARY. Hat wunderbar geklappt...ich habe bei der check_user()-Funktion einfach das
                              WHERE usernick = '".$name."'"
                              durch
                              WHERE BINARY usernick = '".$name."'"
                              ersetzt, und jetzt klappt es mit der Groß- und Kleinschreibung beim Login.
                              Ich bin mir nur nicht sicher, ob es bei den anderen Funktionen auch eine Relevanz hat, das BINARY zu ergänzen. Bei der login()-Funktion zumindestens wahrscheinlich schon, bei der logged_in()-Funktion bin ich mir noch nicht ganz sicher und bei der logout()-Funktion braucht man es wohl nicht.

                              Wegen der check_user()-Funktion: Nein, der User kann sein unverschlüsseltes Passwort eingeben, da das Passwort im Cookie bereits verschlüsselt vorliegt und beim Login wird das eingegebene Passwort zunächst verschlüsselt und dann erst an die check_user()-Funktion übergeben...

                              Kommentar

                              Lädt...
                              X