Ankündigung

Einklappen
Keine Ankündigung bisher.

Direkter Logout nach Login?

Einklappen

Neue Werbung 2019

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

  • Direkter Logout nach Login?

    Hallo liebes PHP-Forum,

    ich habe seit geraumer Zeit ein Problem mit meiner Authentifizierung am Webserver. Ich habe damals für meine Plattform eine Tutorial benutzt, für Login und Registrierung und dieses in meine PHP-Seite eingebunden. Seit einiger Zeit werde ich manchmal einfach ausgeloggt, während ich auf der Plattform Einträge ändere und speichere. Mittlerweile ist es jedoch so, dass ich mich gar nicht mehr einloggen kann. Ich gebe meine Benutzerdaten an, klicke auf Einloggen und ich bin wieder beim Login. Oder ich logge mich ein, bin ein paar Sekunden eingeloggt und sobald ich den nächsten Klick auf eine Seite mache, lande ich wieder beim Login. Woran könnte das liegen?

    Hier der relevante Quelltext:

    Index.php
    PHP-Code:
    <?php
    // Fehlermeldungen anzeigen
    error_reporting('on');
    ini_set('display_errors''on');
    // Erzwingen das Session-Cookies benutzt werden und die SID nicht per URL transportiert wird
    ini_set'session.use_cookies''1' );
    ini_set'session.use_only_cookies''1' );
    ini_set'session.use_trans_sid''0' );
    // Session starten
    session_start();
    // Sicherstellen das die SID durch den Server vergeben wurde
    // um einen möglichen Session Fixation Angriff unwirksam zu machen
    if (!isset( $_SESSION['server_SID'] )) {
        
    // Möglichen Session Inhalt löschen
        
    session_unset();
        
    // Ganz sicher gehen das alle Inhalte der Session gelöscht sind
        
    $_SESSION = array();
        
    // Session zerstören
        
    session_destroy();
        
    // Session neu starten
        
    session_start();
        
    // Neue Server-generierte Session ID vergeben
        
    session_regenerate_id();
        
    // Status festhalten
        
    $_SESSION['server_SID'] = true;
    }
    // Funktionen einbinden
    include('funktionen.inc.php');
    // Variablen deklarieren
    $_SESSION['angemeldet'] = false;
    $conid                  '';
    $eingabe                = array();
    $anmeldung              false;
    $update                 false;
    $fehlermeldung          '';
    // Datenbankverbindung öffnen
    $conid db_connect();
    // Wenn das Formular abgeschickt wurde
    $notcorrect false;
    if (isset( 
    $_POST['login'] )) {
        
    // Benutzereingabe bereinigen
        
    $eingabe cleanInput();
        
    // Benutzer anmelden
        
    $anmeldung loginUser$eingabe['benutzername'], $eingabe['passwort'], $conid );
        
    // Anmeldung war korrekt
        
    if ($anmeldung) {
            
    // Benutzer Identifikationsmerkmale in DB speichern
            
    $update updateUser$eingabe['benutzername'], $conid );
            
    // Bei erfolgreicher Speicherung
            
    if ($update) {
                
    $admin checkAdmin$conid );
                
    $user checkUser$conid );
                
    //$oldUser = checkOldUser( $conid );
                
    if ($admin) {
                    
    // auf Chefseite weiterleiten
                    
    header 'location:admin/adminHome.php' );
                    exit;
                } else {
                    
    // auf Mitarbeiterbereich weiterleiten
                    
    header 'location:mitarbeiter/mitarbeiterHome.php' ); 
                    exit;
                }
    /* else {
                    // auf alte Mitarbeiterbereich weiterleiten
                    header ( 'location:mitarbeiterAlt/Home.php' );
                    exit;
                }*/
            // Fehlermeldung falls nicht Mitarbeiter nicht erfolgreich aktualisiert wurde
            
    } else {
                
    $fehlermeldung '<h3><font color="orange">Bei der Anmeldung ist ein Problem aufgetreten.</font></h3>';
            }
        
    // Fehlermeldung falls Eingabedaten nicht korrekt / Mitarbeiter noch nicht aktiviert
        
    } else {
            
    $fehlermeldung '<h3><font color="orange">Eingabe nicht korrekt oder Konto noch nicht aktiviert.</font></h3>';
            
    $notcorrect true;
        }
    }
    ?>
    Hier die relevanten Funktionen die aufgerufen werden:

    functionen.inc.php
    PHP-Code:
    <?php
    /* *************************** */
    /* *** Datenbankverbindung *** */
    /* *************************** */
    function db_connect()
    {
        
    // Zugangsdaten für die DB
        
    ....
        
    // Verbindung herstellen und Verbindungskennung zurück geben
        
    $conid mysql_connect$dbhost$dbuser$dbpass ) or die( 'Verbindungsfehler!' );
        if (
    is_resource$conid ))
        {
            
    mysql_select_db$dbname$conid ) or die( 'Datenbankfehler!' );
        }
        return 
    $conid;
    }
    /* ********************************** */
    /* *** Benutzereingabe bereinigen *** */
    /* ********************************** */
    function cleanInput()
    {
        
    // Maskierende Slashes aus POST Array entfernen
        
    if (get_magic_quotes_gpc())
        {
            
    $eingabe['benutzername'] = stripslashes$_POST['benutzer'] );
            
    $eingabe['passwort']     = stripslashes$_POST['passwort'] );
        }
        else
        {
            
    $eingabe['benutzername'] = $_POST['benutzer'];
            
    $eingabe['passwort']     = $_POST['passwort'];
        }
        
    // Trimmen
        //$eingabe['benutzername'] = trim( $eingabe['benutzername'] );
        //$eingabe['passwort']     = trim( $eingabe['passwort'] );
        // In Kleinschrift umwandeln
        //$eingabe['benutzername'] = strtolower( $eingabe['benutzername'] );
        // Eingabe zurückgeben
        
    return $eingabe;
    }
    /* ************************* */
    /* *** Benutzer anmelden *** */
    /* ************************* */
    function loginUser$benutzer$passwort$conid )
    {
        
    // Anweisung zusammenstellen
        
    $sql "SELECT
                    `passwort`
                FROM
                    `mitarbeiter`
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "' 
                AND
                    (`aktiviert` = 1 OR `aktiviert` = 'Nein')"
    ;
        
    // Anweisung an DB schicken
        
    $ergebnis mysql_query$sql$conid );
        
    // Wurde ein Datensatz gefunden, existiert dieser Benutzername, also
        // prüfen wir ob die Anmeldedaten korrekt ist
        
    if (mysql_num_rows($ergebnis) == 1)
        {
            
    $datensatz mysql_fetch_array$ergebnis );
            
    // Resourcen freigeben
            
    mysql_free_result$ergebnis );
            
    // Anmeldepasswort vorbereiten
            
    $anmeldepw md5$passwort );
            
    // Anweisung zusammenstellen
            
    $sql "SELECT
                        `mitarbeiterID`, `fehlversuche`
                    FROM
                        `mitarbeiter`
                    WHERE
                        `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "' AND
                        `passwort` = '" 
    .mysql_real_escape_string$anmeldepw ). "' AND
                        (`aktiviert` = 1 OR `aktiviert` = 'Nein')"
    ;
            
    // Anweisung an DB schicken
            
    $ergebnis mysql_query$sql$conid );
            
    // Prüfen ob ein Datensatz gefunden wurde. In dem Fall stimmen die Anmeldedaten
            
    if (mysql_num_rows$ergebnis ) == 1)
            {
                
    // Counter für Fehlversuche resetten
                
    $angriff mysql_fetch_array$ergebnis );
                if (
    $angriff['fehlversuche'] != 0)
                {
                    
    $sql "UPDATE
                                `mitarbeiter`
                            SET
                                `fehlversuche` = 0
                            WHERE
                                `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "'
                            LIMIT
                                1"
    ;
                    
    mysql_query$sql$conid );
                }
                
    // Resourcen freigeben
                
    mysql_free_result$ergebnis );
                
    // Korrekte Anmeldung zurückgeben
                
    return true;
            }
            else
            {
                
    // Das angegebene Passwort war nicht korrekt, also gehen wir von einem Angriffsversuch aus
                // und erhöhen den Counter der fehlerhaften Anmeldeversuche
                
    $sql "UPDATE
                            `mitarbeiter`
                        SET
                            `fehlversuche` = `fehlversuche` + 1
                        WHERE
                            `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "'
                        LIMIT
                            1"
    ;
                
    mysql_query$sql$conid );
                
    // Abfragen ob das Limit von 10 Fehlversuche erreicht wurde und in diesem Fall ...
                
    $sql "SELECT
                            `fehlversuche`
                        FROM
                            `mitarbeiter`
                        WHERE
                            `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "'";
                
    $ergebnis mysql_query$sql$conid );
                
    $anzahl mysql_fetch_array$ergebnis );
                
    mysql_free_result$ergebnis );
                
    // ... das Konto deaktivieren
                
    if ($anzahl['fehlversuche'] > 9)
                {
                    
    $sql "UPDATE
                                `mitarbeiter`
                            SET
                                `fehlversuche` = 0,
                                `aktiviert` = 0
                            WHERE
                                `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "'
                            LIMIT
                                1"
    ;
                    
    mysql_query$sql$conid );
                }
            }
        }
    }
    /* **************************** */
    /* *** Administrator prüfen *** */
    /* **************************** */
    function checkAdmin$conid )
    {
        
    // Alte Session löschen und Sessiondaten in neue Session transferieren
        
    session_regenerate_idtrue );
        
    // Benutzerdaten aus DB laden
        
    $sql "SELECT
                    `ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
                FROM
                    `mitarbeiter`
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "' AND
                    `admin` = 1"
    ;
        
    $ergebnis mysql_query$sql$conid );
        if (
    mysql_num_rows$ergebnis ) == 1)
        {
            
    $benutzerdaten mysql_fetch_array$ergebnis );
            
    // Resourcen freigeben
            
    mysql_free_result$ergebnis );
            
    // Daten aus der DB mit den Benutzerdaten vergleichen
            
    if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
            if (
    $benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
            if (
    $benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
            if ((
    $benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
        }
        else
        {
            return 
    false;
        }
        
    // Wenn die Benutzerdaten okay sind
        // Letzte Aktivität aktualisieren
        
    $sql "UPDATE
                    `mitarbeiter`
                SET
                    `zuletzt_aktiv` = NOW()
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "'
                LIMIT
                    1"
    ;
        
    mysql_query$sql$conid );
        
    // Status zurückgeben
        
    return true;
    }
    /* **************************************** */
    /* *** Benutzer Datensatz aktualisieren *** */
    /* **************************************** */
    function updateUser$benutzer$conid )
    {
        
    // Benutzer-Datensatz aktualisieren
        
    $sql "UPDATE
                    `mitarbeiter`
                SET
                    `ip` = '" 
    .mysql_real_escape_string$_SERVER['REMOTE_ADDR'] ). "',
                    `benutzerinfo` = '" 
    .mysql_real_escape_string$_SERVER['HTTP_USER_AGENT'] ). "',
                    `anmeldung` = '" 
    .mysql_real_escape_stringmd5$_SERVER['REQUEST_TIME'] ) ). "',
                    `zuletzt_aktiv` = NOW()
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$benutzer ). "'
                LIMIT
                    1"
    ;
        
    mysql_query$sql$conid );
        
    // Prüfen ob der datensatz aktualisiert wurde
        
    if (mysql_affected_rows$conid ) == 1)
        {
            
    // Session Variablen setzen
            
    $_SESSION['angemeldet']   = true;
            
    $_SESSION['benutzername'] = $benutzer;
            
    $_SESSION['anmeldung']    = md5$_SERVER['REQUEST_TIME'] );
            return 
    true;
        }
    }

    /* *********************************** */
    /* *** Status des Benutzers prüfen *** */
    /* *********************************** */
    function checkUser$conid )
    {
        
    // Alte Session löschen und Sessiondaten in neue Session transferieren
        
    session_regenerate_idtrue );
        if (
    $_SESSION['angemeldet'] !== true) return false;
        
    // Benutzerdaten aus DB laden
        
    $sql "SELECT
                    `ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
                FROM
                    `mitarbeiter`
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "' AND
                    `aktiviert` = 1"
    ;
        
    $ergebnis mysql_query$sql$conid );
        if (
    mysql_num_rows$ergebnis ) == 1)
        {
            
    $benutzerdaten mysql_fetch_array$ergebnis );
            
    // Resourcen freigeben
            
    mysql_free_result$ergebnis );
            
    // Daten aus der DB mit den Benutzerdaten vergleichen
            
    if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
            if (
    $benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
            if (
    $benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
            if ((
    $benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
        }
        else
        {
            return 
    false;
        }
        
    // Wenn die Benutzerdaten okay sind
        // Letzte Aktivität aktualisieren
        
    $sql "UPDATE
                    `mitarbeiter`
                SET
                    `zuletzt_aktiv` = NOW()
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "'
                LIMIT
                    1"
    ;
        
    mysql_query$sql$conid );
        
    // Status zurückgeben
        
    return true;
    }
    /* *********************************** */
    /* *** Status des Benutzers prüfen *** */
    /* *********************************** */
    function checkOldUser$conid )
    {
        
    // Alte Session löschen und Sessiondaten in neue Session transferieren
        
    session_regenerate_idtrue );
        if (
    $_SESSION['angemeldet'] !== true) return false;
        
    // Benutzerdaten aus DB laden
        
    $sql "SELECT
                    `ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
                FROM
                    `mitarbeiter`
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "' AND
                    `aktiviert` = 'Nein'"
    ;
        
    $ergebnis mysql_query$sql$conid );
        if (
    mysql_num_rows$ergebnis ) == 1)
        {
            
    $benutzerdaten mysql_fetch_array$ergebnis );
            
    // Resourcen freigeben
            
    mysql_free_result$ergebnis );
            
    // Daten aus der DB mit den Benutzerdaten vergleichen
            
    if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
            if (
    $benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
            if (
    $benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
            if ((
    $benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
        }
        else
        {
            return 
    false;
        }
        
    // Wenn die Benutzerdaten okay sind
        // Letzte Aktivität aktualisieren
        
    $sql "UPDATE
                    `mitarbeiter`
                SET
                    `zuletzt_aktiv` = NOW()
                WHERE
                    `benutzername` = '" 
    .mysql_real_escape_string$_SESSION['benutzername'] ). "'
                LIMIT
                    1"
    ;
        
    mysql_query$sql$conid );
        
    // Status zurückgeben
        
    return true;
    }
    ?>
    Weißt jemand von euch woran das liegen könnte?
    Das Problem ist kurzzeitig weg, wenn ich etwas im Quelltext ändere und die Datei erneut hochlade. Dann dachte ich schon an Probleme mit den Cookies. Jedoch bleibt das Problem auch nach Löschen dieser vorhanden.

    Vielleicht kann jemand von euch weiterhelfen?

    Viele Grüße,

    Colin

  • #2
    Lösung: Bau es in OOP um: http://www.peterkropff.de/site/php/oop.htm
    Homepage: www.jplace.de

    Github: JohnnyDevNull

    Kommentar


    • #3
      PHP-Code:
      $_SESSION['angemeldet'] = false
      Macht diese Zeile wirklich Sinn?

      PS: Die mysql_* -Funktionen solltest nicht mehr verwedet werden. (Siehe Signatur)
      [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
      [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

      Kommentar


      • #4
        PHP-Code:
                if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false
        Blöd wenn sich meine IP ändert, dann kann ich mich nicht mehr einloggen... A) ganz schön doof, B) Schon mal was von Datenschutz gehört? Es ist nicht ganz Erlaubt die IP-Adresse von Nutzern zu speichern.
        - Laravel

        Kommentar


        • #5
          Das habe ich ja.

          Ich habe das eingebaut, damit sich nur Benutzer einloggen, die über das Firmennetzwerk arbeiten

          Kommentar


          • #6
            Sofern da 100% gewährleistet ist die IP gleich ist kann man das machen, ist aber total überflüssig da man den Webserver auch einfach nur Lokal erreichbar machen kann^^
            - Laravel

            Kommentar


            • #7
              Verwendest Du zum Speichern der Session den default-save-handler oder einen eigenen?

              tritt das Problem auch auf wenn Du session_regenerate_id( true ); überall auskommentierst?

              vg
              jack
              -

              Kommentar


              • #8
                An dieser Stelle möchte ich nochmal auf meine Frage im 3. Beitrag aufmerksam machen.

                Außerdem sind noch 2 Dinge bei diesem Loginsystem ziemlich schlecht gelöst.
                1. md5 wurde nie für Passwörter entwickelt und sollte auf keinen Fall dafür genutzt werden. (Warum findest du hier und im Internet zu hauf)
                2. Deine Sperre nach X falschen Anmeldungen kann man auch schön missbrauchen, um z.B. den Admin auszusperren (Ist keine wirkliche Lücke, kann aber einen sehr dummen Nebeneffekt haben...)
                [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                Kommentar


                • #9
                  Außerdem sind noch 2 Dinge bei diesem Loginsystem ziemlich schlecht gelöst.
                  1. md5 wurde nie für Passwörter entwickelt und sollte auf keinen Fall dafür genutzt werden. (Warum findest du hier und im Internet zu hauf)
                  2. Deine Sperre nach X falschen Anmeldungen kann man auch schön missbrauchen, um z.B. den Admin auszusperren (Ist keine wirkliche Lücke, kann aber einen sehr dummen Nebeneffekt haben...)
                  Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.
                  Sorry, inwiefern tragen diese "Antworten" zur Lösung des Problems ("Logout nach Login") bei?!

                  vg
                  jack
                  -

                  Kommentar


                  • #10
                    Zitat von jack88 Beitrag anzeigen
                    Sorry, inwiefern tragen diese "Antworten" zur Lösung des Problems ("Logout nach Login") bei?!

                    vg
                    jack
                    Das sind Hinweise, ohne deren Umsetzung man davon absehen sollte, dieses Skript produktiv einzusetzen.
                    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                    Kommentar


                    • #11
                      Vielen Dank für eure Hilfe. Habe die session_regenerate(id) auskommentiert. Jetzt funktioniert es einwandfrei. Die Sache mit dem aussperren des Admins funktioniert ja auch nur, wenn man den Nutzernamen des Admins (der Admins) kennt. Zu der Verschlüsselung mit md5 habe ich nun ein wenig recherchiert und habe jetzt umgestellt auf "Ein-Weg"-Verschlüsselung mit Hashing. Vielen Dank für Tipps und Hilfe. Kann jetzt wieder wie gewohnt arbeiten.

                      Viele Grüße und herzlichen Dank, Colin

                      Kommentar


                      • #12
                        Zitat von klapscolin Beitrag anzeigen
                        Zu der Verschlüsselung mit md5 habe ich nun ein wenig recherchiert und habe jetzt umgestellt auf "Ein-Weg"-Verschlüsselung mit Hashing.
                        Alleine anhand dieses Satzes kann ich dir nur nochmal wärmstens ans Herz legen, dich noch einmal mit dem Thema auseinander zu setzen....
                        md5 hat mit Verschlüsselung nichts zu tun und eine "Ein-Weg-Verschlüsselung" hattest du auch schon in der geposteten Variante.
                        [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                        [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                        Kommentar


                        • #13
                          Jupp, einfach mal das hier aufmerksam durchlesen. http://php.net/manual/de/faq.passwords.php
                          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                          Kommentar

                          Lädt...
                          X