Ich habe ein paar Monate damit verbracht, eine Anwendung auf einer meiner Domains zu entwickeln. Es ist insgesamt ein einfaches Konzept. Während der Entwicklung habe ich es selbst auf meiner eigenen Domain gehostet, aber vor kurzem hat es zu unserer aktuellen verschoben. Das Problem ist, dass Sitzungen nicht zwischen den Seiten erstellt oder beibehalten werden, und ich kann nicht für das Leben von mir herausfinden, warum.PHP Sitzungen verloren zwischen den Seiten - verhält sich je nach Server unterschiedlich
Entschuldigung für die Wand des Codes unten, aber ich bevorzuge es über eine theoretische Erklärung.
Beginnen wir mit, wie ich meine Session am Anfang jeder Seite beginnen:
function sec_session_start() {
$session_name = 'login';
$secure = false;
$httponly = true;
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(86400, '/', '.domain.com', $secure, $httponly);
session_name($session_name);
session_start();
session_regenerate_id();
}
Und dann, wie ich überprüfen, ob der Benutzer angemeldet ist Ich habe return x;
statt false
für die Fehlersuche.. Ich füge das an die Weiterleitungs-URL an.
function login_check($mysqli) {
if(isset($_SESSION['id'], $_SESSION['login_string'], $_SESSION['type'])) {
$id = $_SESSION['id'];
$login_string = $_SESSION['login_string'];
$user_browser = $_SERVER['HTTP_USER_AGENT'];
if($_SESSION['type'] == 1 || $_SESSION['type'] == 2) // Admin user
{
if ($stmt = $mysqli->prepare("SELECT `password` FROM `users` WHERE `id` = ? LIMIT 1")) {
$stmt->bind_param('s', $id);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows == 1) {
$stmt->bind_result($password);
$stmt->fetch();
$login_check = hash('sha512', $password.$user_browser);
if($login_check == $login_string) {
return true;
} else {
return 1;
}
} else {
return 2;
}
} else {
return 3;
}
} else if($_SESSION['type'] == 3) { // Standard user
if($stmt=$mysqli->prepare("SELECT `password` FROM `proj` WHERE `id` = ? LIMIT 1"))
{
$stmt->bind_param("s", $_SESSION['id']);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows == 1)
{
$stmt->bind_result($db_key);
$stmt->fetch();
$login_check = hash('sha512', $db_key.$user_browser);
if($login_check == $login_string) {
return true;
} else {
return 4;
}
}
}
} else {
return 5;
}
} else {
return 6;
}
}
Ich habe zwei Anmeldeseiten, eine für Administratoren und eine für Benutzer.
Admin:
<?php
ini_set('display_errors','On');
error_reporting(E_ALL);
include_once "../functions.php";
include_once "../db_connect.php";
sec_session_start();
if(login_check($mysqli) === true) {
header('Location: ../index.php');
}
else
{
// Login form
}
Benutzer:
<?php
ini_set('display_errors','On');
error_reporting(E_ALL);
include_once "../functions.php";
include_once "../db_connect.php";
sec_session_start();
if(login_check($mysqli) === true) {
header('Location: ../index.php');
}
else
{
// Login form
}
Ganz gleich, abgesehen von den Dateiquellen als Admin login.php
in /admin
befindet. Trotzdem zeigt die erste das Login-Formular korrekt an, während die zweite Sie auf index.php
umleitet (auch wenn inkognito, ein Mysterium für mich), eine Umleitungsschleife verursacht (wie index.php
sendet es zurück für Nog angemeldet ist).
Darüber hinaus, wenn ich mich mit den richtigen Anmeldeinformationen anmelden, leitet es mich an index.php
nur um mich zurück zu login.php
mit Fehlercode 6
zu leiten.
Bitte Kommentar, wenn Sie weitere Informationen oder Codebeispiele wünschen, fühle ich mich verloren in meinem eigenen Projekt jetzt.
Jede Hilfe ist willkommen, Sie
UPDATE 17. Dezember danken:
Nach ein paar Stunden von Debug, haben wir festgestellt, dass das Problem nicht mit dem Code ist aber mit der Serverkonfiguration . Ein einfaches Beispiel:
<?php
session_start();
echo session_id();
?>
Wenn Sie diese Datei auf dem Produktionsserver öffnen und die Seite aktualisieren, zeigt es eine neue Session-ID mit jeder Anfrage. Ich habe derzeit keine Ahnung warum. Ich habe bestätigt, dass die Sitzungsdatei sowie das Cookie erstellt wurde. Es enthält die richtigen Informationen und kann von SSH mit Serverberechtigungen zugegriffen werden. Wirklich ein seltsames Verhalten.
Irgendwelche Hinweise?
sicherstellen, dass die Sitzung nur einmal pro Anfrage gestartet wird, z. B. wenn mehrere Dateien 'sec_session_start()' in derselben Anfrage aufrufen, was wird passieren? –
verschiedene Serverkonfigurationen behandeln Sitzungen unterschiedlich, zB über Cookies oder Dateien etc .. Die Art und Weise, wie die Sitzung initialisiert wird, macht einen Unterschied, dies sind nur allgemeine Kommentare –
1) Haben Sie eine lokale 'php.ini' auf Ihrer verschiedene Server? Einstellungen wie "session.savepath" mit kontospezifischen Adressen, die sich auf Ihren Test- und Produktionsservern ändern. 2) Sind auf Ihren beiden Servern die gleiche PHP-Version installiert? 3) Führen Sie "phpinfo" aus und vergleichen Sie die Ausgabeeinstellungen auf den beiden Servern, um Unterschiede zu vergleichen (z. B. sitzungsbezogene Adressen). Gibt Ihnen irgendwas davon irgendwelche neugierigen Antworten? – Martin