PHP 7.2 Warnung: „Sitzungsname kann nicht geändert werden, wenn Sitzung aktiv ist“
Lesezeit: 5 Minuten
Blackbam
Da PHP auf unserem Server von 7.0 auf 7.2 aktualisiert wurde. Ich erhalte die folgende Warnung (die zu einem Fehler führt), wenn eine neue Bereitstellung durchgeführt wird. Der Grund liegt wahrscheinlich darin, dass alte Sitzungen nach der Bereitstellung ungültig werden.
Warnung: session_name(): Der Sitzungsname kann nicht geändert werden, wenn die Sitzung aktiv ist /var/www/html/model/login/lib/Session.class.php in Zeile 137
Warnung: session_set_cookie_params(): Sitzungs-Cookie-Parameter können nicht geändert werden, wenn die Sitzung aktiv ist
/var/www/html/model/login/lib/Session.class.php in Zeile 138
Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von (Ausgabe gestartet unter /var/www/html/model/login/lib/Session.class.php:137) in /var/www/html/model/login/lib/ Session.class.php in Zeile 142
Es scheint, als ob PHP 7.2 im Sitzungskontext in einem bestimmten Kontext strenger geworden ist. Der Server scheint die ungültigen Sitzungen zu erkennen und versucht, diese zu zerstören. Dies ist Teil der Session-Klasse:
/**
* Secure instant destruction of session. Must be called after session_start !
*/
public static function destroyAbsolute() {
self::checkInit(); // unimportant
session_name(self::$name); // this is line 137
session_set_cookie_params(0, COOKIEPATH, null, self::$force_ssl_cookie, true);
if(session_id()) {
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), "", time() - 42000, COOKIEPATH);
}
unset($_COOKIE[session_name()]);
session_destroy();
}
}
Was hat sich in PHP bezüglich Sitzungen geändert?
Warum ist es nicht erlaubt, einen Sitzungsnamen festzulegen, wenn eine andere Sitzung aktiv ist (Laut den Dokumenten mit Sitzungsname könnte ich Sitzungen ändern und mehrere Sitzungen starten)?
Und wie kann ich die laufende Sitzung angemessen zerstören?
Bei weiteren Recherchen habe ich auch die folgende Diskussion auf GitHub gefunden (https://github.com/Icinga/icingaweb2/issues/3185). Sie bestätigen, dass dieser Fehler mit PHP 7.2 eingeführt wurde. Leider gibt es auch keine Antwort :-/
Der if(session_id()) {} Die Überprüfung deutet darauf hin destroyAbsolute() erwartet das manchmal session_start() wurde aufgerufen und manchmal auch nicht. Ihr Aufruf an session_name() sollte dann der gleichen Logik folgen.
– Álvaro González
7. Dezember 2017 um 17:19 Uhr
Der Kommentar „Muss nach session_start aufgerufen werden“ steht im Widerspruch zu den Dokumenten von session_name() „Du musst anrufen session_name() […] Vor session_start()“. Ich gehe davon aus, dass dieser Code die Sitzung mit dem Namen nie gelöscht hat self::$name.
– Roland Starke
7. Dezember 2017 um 17:22 Uhr
@RolandStarke Laut Dokumentation kann session_name auch auf SET oder CHOOSE gesetzt werden, um den Namen der aktuellen Sitzung festzulegen. Können Sie einen Link zu den Dokumenten erstellen, da ich nicht finden kann, wo dies dokumentiert ist?
– Blackbam
7. Dezember 2017 um 17:27 Uhr
Verwendung der Weg zurück Maschine und wenn man so weit wie möglich zurückgeht (2001), findet man dasselbe Zitat. “[…] vor session_start() oder session_register()“. Ich gehe also davon aus, dass es sich nicht um eine neue Funktion handelt. Vielleicht ist es in früheren Versionen stillschweigend fehlgeschlagen und jetzt liegt ein Fehler vor. Könnten Sie die aktuelle Sitzung schließen und eine neue starten? session_write_close(); session_name(self::$name); session_set_cookie_params(...); session_start();?
– Roland Starke
8. Dezember 2017 um 7:22 Uhr
Dieses Problem tritt beim Upgrade auf Drupal 7 auf. Jeder, der dies für Drupal sieht, kann nachsehen Hier.
– mbomb007
15. Juli 2019 um 18:44
Ich habe einen Fehlerbericht bei php.net erstellt und sie erklärten, dass dies kein Fehler sei. Ja, in PHP 7.2 wird jetzt eine Warnung generiert. Dies hat jedoch nie wie beabsichtigt funktioniert ist einfach stillschweigend gescheitert.
Zum Erstellen mehrerer Sitzungen ist die Verwendung erforderlich session_id(). Schauen Sie sich diese verwandte Frage an: PHP Wie kann ich mehrere Sitzungen erstellen?
session_name() ebenso gut wie session_set_cookie_params() sind immer unsinnig, wenn die Sitzung bereits läuft.
Frühere PHP-Versionen haben unseren Fehler übersehen (Wir haben praktisch eine bereits vorhandene Sitzung umbenannt und ihnen Eigenschaften gegeben, was sehr falsch ist. Wie habe ich dieses Problem gelöst?)
Da die Sitzungssteuerung von PHP die Sitzungslebensdauer bei Verwendung von session_set_cookie_params() nicht korrekt verarbeitet, müssen wir etwas tun, um die Sitzungsablaufzeit jedes Mal zu ändern, wenn der Benutzer unsere Website besucht. Hier liegt also das Problem.
Dieser Code ändert nichts an der Lebensdauer der Sitzung, wenn der Benutzer auf unsere Website zurückkehrt oder die Seite aktualisiert. Die Sitzung läuft nach $lifetime Sekunden ab, unabhängig davon, wie oft der Benutzer die Seite anfordert. Deshalb überschreiben wir einfach das Sitzungscookie wie folgt:
Der
if(session_id()) {}
Die Überprüfung deutet darauf hindestroyAbsolute()
erwartet das manchmalsession_start()
wurde aufgerufen und manchmal auch nicht. Ihr Aufruf ansession_name()
sollte dann der gleichen Logik folgen.– Álvaro González
7. Dezember 2017 um 17:19 Uhr
Der Kommentar „Muss nach session_start aufgerufen werden“ steht im Widerspruch zu den Dokumenten von
session_name()
„Du musst anrufensession_name()
[…] Vorsession_start()
“. Ich gehe davon aus, dass dieser Code die Sitzung mit dem Namen nie gelöscht hatself::$name
.– Roland Starke
7. Dezember 2017 um 17:22 Uhr
@RolandStarke Laut Dokumentation kann session_name auch auf SET oder CHOOSE gesetzt werden, um den Namen der aktuellen Sitzung festzulegen. Können Sie einen Link zu den Dokumenten erstellen, da ich nicht finden kann, wo dies dokumentiert ist?
– Blackbam
7. Dezember 2017 um 17:27 Uhr
Verwendung der Weg zurück Maschine und wenn man so weit wie möglich zurückgeht (2001), findet man dasselbe Zitat. “[…] vor session_start() oder session_register()“. Ich gehe also davon aus, dass es sich nicht um eine neue Funktion handelt. Vielleicht ist es in früheren Versionen stillschweigend fehlgeschlagen und jetzt liegt ein Fehler vor. Könnten Sie die aktuelle Sitzung schließen und eine neue starten?
session_write_close(); session_name(self::$name); session_set_cookie_params(...); session_start();
?– Roland Starke
8. Dezember 2017 um 7:22 Uhr
Dieses Problem tritt beim Upgrade auf Drupal 7 auf. Jeder, der dies für Drupal sieht, kann nachsehen Hier.
– mbomb007
15. Juli 2019 um 18:44