kostenloser Webspace werbefrei: lima-city


$_SESSION wird nicht gespeichert

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    dipoxegames

    dipoxegames hat kostenlosen Webspace.

    Guten Tag liebe Lima-City Community,

    und zwar habe ich einen SecureSession script, der es mir ermöglichen soll das mein Mitgliedschafts-System nicht von fremden missbraucht wird. Nur funktioniert irgendwie die Speicherung der $_SESSION nicht:
    Nach einem erfolgreichen Login lese ich die $_SESSION aus und dort sind die Daten vorhanden, sobald die Seite neu geladen wird ist $_SESSION leer, kann mir jemand helfen?

    Hier soweit alle benötigten Dateien:
    index.php
    <?php
        include_once __DIR__.DIRECTORY_SEPARATOR.'api'.DIRECTORY_SEPARATOR.'lang.inc.php';
        include_once __DIR__.DIRECTORY_SEPARATOR.'api'.DIRECTORY_SEPARATOR.'login.inc.php';
        $loggedIn = login_check();
    ?>
    [...]

    login.inc.php
    <?php
    include_once dirname(__FILE__).'/sec_session.inc.php';
    include_once dirname(__FILE__).'/db.inc.php';
    
    function login($user, $pass) {
        global $dbc;
        
        $username = filter_var($user, FILTER_SANITIZE_STRING);
        $password = filter_var($pass, FILTER_SANITIZE_STRING);
        
        // Das benutzen vorbereiteter Statements verhindert SQL-Injektion
        if($stmt = $dbc->prepare("SELECT id, user, pass, salt, access FROM ***** WHERE user = ? LIMIT 1")) {
            $stmt->bind_param('s', $username);
            $stmt->execute();
            $stmt->store_result();
            
            // hole Variablen von result
            $stmt->bind_result($user_id, $db_user, $db_pass, $salt, $access);
            $stmt->fetch();
            
            // hash das Passwort mit dem eindeutigen salt.
            $password = hash('sha512', $password.$salt);
            if($stmt->num_rows == 1) {
    echo "<br/>user founded.";
                // Wenn es den Benutzer gibt, dann wird überprüft ob das Konto blockiert ist durch zu viele Login-Versuche
                if(checkbrute($user_id) == TRUE) {
    echo "<br/>checkbrute failed.";
                    // Konto ist blockiert
                    return FALSE;
                } else {
    echo "<br/>checkbrute ok.";
                    // Überprüfe, ob das Passwort in der Datenbank mit dem vom Benutzer angegebenen übereinstimmt
                    if($db_pass == $password) {
    echo "<br/>pass check ok.";
                        // Passwort ist korrekt!
                        // Hole den user-agent string des Benutzers
                        $user_browser = $_SERVER['HTTP_USER_AGENT'];
                        // XSS-Schutz, denn eventuell wir der Wert gedruckt
                        $user_id = preg_replace('/[^0-9]+/', '', $user_id);
                        $_SESSION['user_id'] = $user_id;
                        $user = preg_replace('/[^a-zA-Z0-9_\-]+/', '', $username);
                        $_SESSION['user'] = $username;
                        $_SESSION['login_string'] = hash('sha512', $password.$user_browser);
                        
    echo "<br/>";
    var_dump($_SESSION);
                        
                        return TRUE;
                    } else {
    echo "<br/>pass check failed.";
                        // Passwort ist nicht korrekt
                        // Der Versuch wird in der Datenbank gespeichert
                        $now = time();
                        $dbc->query("INSERT INTO *****(user_id, time) VALUE ('$user_id', '$now')");
                        
                        return FALSE;
                    }
                }
            } else {
                // Es gibt keinen Benutzer
                
                return FALSE;
            }
        }
    }
    
    [...]
    
    ?>

    sec_session.inc.php
    <?php
    
    function sec_session_start() {
        $session_name = '*****';
        $secure = FALSE; // TRUE bei HTTPS
        // Damit wird verhindert, dass Javascript auf die session id zugreifen kann.
        $httponly = TRUE;
        // Zwingt sie Sessions nur Cookies zu benutzen
        if(ini_set('session.use_only_cookies', 1) === FALSE) {
            header('Location: ../error.php?err=Could not initiate a safe session (ini_set)');
            exit();
        }
        // Holt Cookie-Parameter
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, $httponly);
        
        session_name($session_name);
        session_start(); // Startet die PHP-Sitzung
        session_regenerate_id(TRUE); // Erneuert die Session, löscht die alte
    echo "CookierParams: ";
    var_dump($cookieParams);
    }
    function sec_session_destroy() {
        $_SESSION = array();
        
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
        
        session_destroy();   
    }
    
    sec_session_start(); // Die sichere Funktion um eine PHP-Sitzung zu starten
    echo "<br/>";
    var_dump($_SESSION);
    
    [...]
    
    ?>


    Kann mir dabei jemand helfen? Finde den Fehler einfach nicht.

    Bei Fragen einfach fragen ;)

    Ich bedanke mich schonmal im Vorraus :)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Hi,

    probiere mal

    session_start();

    in die erste Zeile der index.php zu schreiben ;)

    MFG Micha

    Beitrag zuletzt geändert: 10.8.2016 16:23:05 von michaelkoepke
  4. Autor dieses Themas

    dipoxegames

    dipoxegames hat kostenlosen Webspace.

    Guten Morgen,

    würde das nicht zu konflikten führen?
    Weil in der funktion sec_session_start() der sec_session.inc.php Datei wird nach Änderung der Session Parameter die session_start() aufgerufen.

    MfG
  5. Hallo,
    ich glaube hier ist ein (alt-) bekanntes Problem vorhanden:
    Der Befehl session_start(); darf nicht irgendwo im Script stehen, sondern muß in die erste Zeile!!!

    FUNKTIONIERT: :wave:
    <?php
    session_start();
    $_SESSION['test'] = "world";
    echo "hello {$_SESSION['test']} !!!";
    ?>

    FUNKTIONIERT NICHT: :scared:
    <?php
    echo "neue Zeile dazu<p>";
    session_start();
    $_SESSION['test'] = "world";
    echo "hello {$_SESSION['test']} !!!";
    ?>

    Es gibt Beispiele in denen nur eine Leerzeile vorher vohanden ist und schon klappt es nicht mehr. Genauer gesagt, darf man keine Ausgabe z.B. ECHO machen (Bildschirm), wenn man den Befehl noch verwenden will.
    Den Befehl in eine Funktion eingebunden habe ich noch nicht gesehen, kann also nur Stress bedeuten.

    Gruss Dunkeltuten
    :spammer:
  6. Autor dieses Themas

    dipoxegames

    dipoxegames hat kostenlosen Webspace.

    Danke für die Antwort,
    Also das vorher keine Ausgabe erfolgen darf, ist mir bekannt und darauf wurde geachtet, habe mittlerweile auch den Fehler gefunden.

    Der Fehler ist tatsächlich in der Funktion, und zwar erzeugt durch die session_name() Funktion:
    function sec_session_start() {
        $session_name = 'testwert!&()"§.';
        $secure = FALSE; // TRUE bei HTTPS
        // Damit wird verhindert, dass Javascript auf die session id zugreifen kann.
        $httponly = TRUE;
        // Zwingt sie Sessions nur Cookies zu benutzen
        if(ini_set('session.use_only_cookies', 1) === FALSE) {
            header('Location: ../error.php?err=Could not initiate a safe session (ini_set)');
            exit();
        }
        // Holt Cookie-Parameter
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, $httponly);
        
        session_name($session_name);
        session_start(); // Startet die PHP-Sitzung
        session_regenerate_id(TRUE); // Erneuert die Session, löscht die alte
        //setcookie(session_name(), session_id(), time() + $cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, $httponly);
    echo "CookierParams: ";
    var_dump($cookieParams);
    }
    Und zwar hat sich im Session Namen ein ungültiges Zeichen versteckt, was aber keine Fehlermeldung wirft. Im normalfall bekomme ich folgende Meldung Cookie names cannot contain any of the following '=,; \t\r\n\013\014', dabei wird der Punkt (.) nicht als ungültiges Zeichen bezeichnet.
    Ohne Punkt im Session Name funktioniert nun alles Super :D

    Danke für eure Hilfe :)
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!