$_SESSION wird nicht gespeichert
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
befehl
benutzen
benutzer
code
dank
datei
domain
fehler
funktion
jemand
konto
login
parameter
punkt
session
sitzung
test
zeichen
zeile
-
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 :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
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:
<?php session_start(); $_SESSION['test'] = "world"; echo "hello {$_SESSION['test']} !!!"; ?>
FUNKTIONIERT NICHT:
<?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
-
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:
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.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); }
Ohne Punkt im Session Name funktioniert nun alles Super :D
Danke für eure Hilfe :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage