Login mit Sessions

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

  • Login mit Sessions

    Hallo zusammen,

    ich beschäftige mich erst seit heute Morgen mit dem Thema Login mit Hilfe von Cookies und Sessions usw. Habe es aber geschafft ne rudimentäre Userverwaltung aufzubauen die mit PHP, MySQL und Sessions arbeitet.

    Nun würde mich interessieren ob ihr den Schutz für ausreichend haltet. Später sollen über die Datenbank Daten wie eMail-Adressen usw. gespeichert werden. Es wäre also ganz gut, wenn man nicht ohne weiteres auf die Daten zugreifen kann.

    Das hier ist mein Code:
    PHP-Code:
    <?
    function logged_in() {
        $sql = "SELECT UserID FROM users WHERE UserSession='".session_id()."' LIMIT 1";
        $query = mysql_query($sql);
        if (mysql_num_rows($query) == 1)
            return true;
        else
            return false;
    }

    function check_pwd($userName, $userPass) {
        $sql = "SELECT UserID AS UserID FROM users WHERE UserName='".$userName."' AND UserPass=MD5('".$userPass."') LIMIT 1;";
        $query = mysql_query($sql);
        if (mysql_num_rows($query) == 1) {
            $user = mysql_fetch_array($query);
            return $user['UserID'];
        }
        else
            return false;
    }

    function update_session($userId) {
        $sql = "UPDATE users SET UserSession='".session_id()."' WHERE UserID=".$userId;
        $query = mysql_query($sql);
        if (mysql_affected_rows() == 1){
            return true;
        }
        else {
            return false;
        }
    }

    function logout() {
        $sql = "UPDATE users SET UserSession = NULL WHERE UserSession='".session_id()."'";
        $query = mysql_query($sql);
        if (mysql_affected_rows() == 1)
            return true;
        else
            return false;
    }



    session_name("sessionid");    
    session_start(); 
    require_once("connectdb.php");
    connectdb("test");
    if (isset($_POST['sent'])) { 
        $_POST['sent']=0;
        $userid = check_pwd($_POST['userName'], $_POST['userPass']); 
        if ($userid) {
            update_session($userid);
        }
        else {
            echo "LogIn fehlgeschlagen!";
            session_destroy();
        }

        
    if (!logged_in()) 
        echo '    <form method="post" action="'.$_SERVER["PHP_SELF"].'"> 
                <label>User: &nbsp;</label><input name="userName" type="text"><br> 
                <label>PWD: </label><input name="userPass" type="password"><br> 
                <input type="submit" value="Eintragen">
                <input type="reset">
                <input type="hidden" name="sent" value="1">
                </form>'; 
    else 
        echo '<a href="logout.php">Ausloggen</a>'; 
    ?>
    Wie man sieht, überprüfe ich die Anmeldung mit Hilfe der SessionID. Die Frage ist nur, wie sicher diese Art der Anmeldung ist. Denn die SessionID bleibt ja in der MySQL Tabelle stehen. Wenn es nicht sicher genug ist, stellt sie die Frage, wie man das verbessern kann.

    Der Aufbau der MySQL Tabelle ist wie folgt:
    PHP-Code:
    UserID      int(11)         PRI    NULL    auto_increment
    UserName    varchar
    (30)         UNI          
    UserPass    varchar
    (32)                    
    UserSession varchar(32)    YES         NULL     
    UserMail    varchar
    (150)         UNI 
    Ich hoffe ihr könnt damit etwas anfangen und mir evtl. auch helfen. Danke schonmal für die Hilfe!

    Gruß Alpenmerlin

  • #2
    mysql_real_escape_string benutzen
    Slava
    bituniverse.com

    Kommentar


    • #3
      Wie gesagt, ich bin Anfänger. Daher ist deine Antwort vielleicht einen Tick zu kurz!

      Habe es trotzdem mal versucht auf das Script anzuwenden:
      PHP-Code:
      //$sql = "SELECT UserID FROM users WHERE UserName='".$userName."' AND UserPass=MD5('".$userPass."') LIMIT 1;";

          
      $sql sprintf("SELECT UserID FROM users WHERE UserName='%s' AND UserPass=MD5('%s') LIMIT 1;",
                  
      mysql_real_escape_string($userName),
                  
      mysql_real_escape_string($userPass)); 
      Ist die Sache damit schon gegessen oder muss man noch mehr daran ändern?

      Und wie sieht es mit dem Erraten der MD5-Prüfsumme aus? Ist es zu unsicher diese in der Datenbank zu speichern? Schließlich könnte man ja reintheoretisch durch ausprobieren auf die Nummer kommen und ist dann eingelogt! Halte es zwar für höchst unwahrscheinlich, würde aber gerne mal die Meinung von erfahrerenen Usern wissen...

      Kommentar


      • #4
        http://de.wikipedia.org/wiki/Md5#Sic....BCberlegungen
        *blubb*

        Kommentar


        • #5
          MD5 ist dafür völlig ok.

          Außerdem gibt man am Login ja nicht den Hash sondern das Passwort ein, also müsste man sowieso das Passwort im Klartext erraten... Und das ist wohl noch einfacher.
          ich glaube

          Kommentar


          • #6
            Hatte es mir bei Wiki schon durchgelesen. Aber Danke nochmal für die Info. Weißt du wie das mit SQL-Injection aussieht? Passt das dann so?

            Kommentar


            • #7
              Wie? Mit den Hashes hat das nichts zu tun. Überprüf alle Eingaben, die vom Benutzer kommen, und wende wie schon gesagt mysql_real_escape_string auf die Strings an.
              ich glaube

              Kommentar


              • #8
                Original geschrieben von ministry
                Wie? Mit den Hashes hat das nichts zu tun. Überprüf alle Eingaben, die vom Benutzer kommen, und wende wie schon gesagt mysql_real_escape_string auf die Strings an.
                Ja, das Prüfen der Eingabe habe ich mit JavaScript vor. Die Frage war ob ich mysql_real_escape_string richtig angewendet habe. Das Skript funktioniert so wie es oben geändert habe. Ob es den Sinn erfüllt weiß ich aber nicht!

                Kommentar


                • #9
                  Original geschrieben von Alpenmerlin
                  Ja, das Prüfen der Eingabe habe ich mit JavaScript vor. Die Frage war ob ich mysql_real_escape_string richtig angewendet habe. Das Skript funktioniert so wie es oben geändert habe. Ob es den Sinn erfüllt weiß ich aber nicht!
                  Hi,

                  und was machst du , wenn der Benutzer Javascript deaktiviert hat?
                  Mit Javascript Benutzereingaben zu prüfen ist zwar nicht verkehrt, du musst aber weiterhin Serverseitig prüfen.

                  Gruss
                  Iglo

                  Kommentar


                  • #10
                    Und wenn wir schon dabei sind mal ne ganz blöde Frage: Ich hab grade angefangen ein neues PHP Script (newUser.php)zu schreiben. Das sieht momentan so aus:
                    PHP-Code:
                    <?
                    session_start(); 
                    echo session_id();
                    ?>
                    Ich bekomme folgende Fehlermeldung:
                    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Programme\xampp\htdocs\functions\newUser.php:1) in C:\Programme\xampp\htdocs\functions\newUser.php on line 2

                    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Programme\xampp\htdocs\functions\newUser.php:1) in C:\Programme\xampp\htdocs\functions\newUser.php on line 2
                    699909c12579fa567c843a7f9bd475c0
                    WARUM?!?
                    Wenn ich einen Reload ausführe ändert sich die SessionID trotzdem...

                    Kommentar


                    • #11
                      Original geschrieben von kapitaeniglo
                      Hi,

                      und was machst du , wenn der Benutzer Javascript deaktiviert hat?
                      Mit Javascript Benutzereingaben zu prüfen ist zwar nicht verkehrt, du musst aber weiterhin Serverseitig prüfen.

                      Gruss
                      Iglo
                      Gutes Argument! Danke für den Hinweis. Man merkt eben doch, wenn ein paar Leute schon einiges gecodet haben...

                      Kommentar


                      • #12
                        Die Fehlermeldung sagt es bereits:
                        Code:
                        headers already sent by (output started at ...\newUser.php:1)
                        Du darfst vor session_start() keine Ausgaben machen.
                        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                        Kommentar


                        • #13
                          Jaja, das ist mir schon klar! Aber wo mache ich denn Angaben? Das ist die komplette Datei! Und <? muss ich ja schreiben...

                          Kommentar


                          • #14
                            er schreibt es nich umsonst?! sicher vorher keine html ausgaben? irgendwo ein echo?!

                            mfg
                            bugbuster
                            tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
                            documentation: php.net mysql.com framework.zend.com

                            Die Nachtwache!

                            Kommentar


                            • #15
                              Wenn du eine UTF-8-Datei hast, check mal mit einem Hexeditor die ersten Zeichen auf die BOM.

                              Kommentar

                              Lädt...
                              X