it-swarm.com.de

PHP 7.2 Warnung: "Sitzungsname kann nicht geändert werden, wenn Sitzung aktiv ist"

Da PHP auf unserem Server von 7.0 auf 7.2 aktualisiert wurde. Ich erhalte die folgende Warnung (die zu Fehlern führt), wenn eine neue Bereitstellung durchgeführt wird. Der Grund ist wahrscheinlich, dass alte Sitzungen nach der Bereitstellung ungültig werden.

Warnung: Sitzungsname (): Sitzungsname kann nicht geändert werden, wenn Sitzung .__ ist. aktiv in /var/www/html/model/login/lib/Session.class.php in Zeile 137

Warnung: session_set_cookie_params (): Sitzungscookie kann nicht geändert werden Parameter, wenn die Sitzung in .__ 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 von .__ gesendet. (Die Ausgabe wurde am /var/www/html/model/login/lib/Session.class.php:137 gestartet) in /var/www/html/model/login/lib/Session.class.php in Zeile 142

Es scheint so, als ob PHP 7.2 im Zusammenhang mit Session-Sin in einem bestimmten Kontext strenger wurde. 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 Sessions geändert? 

Warum ist es nicht zulässig, einen Sitzungsnamen festzulegen, wenn eine andere Sitzung aktiv ist (entsprechend den Dokumenten mit Sitzungsname konnte 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: - /

8
Blackbam

Ich habe einen Fehlerbericht auf php.net erstellt und sie haben erklärt, dass dies kein Fehler ist. Ja in PHP 7.2 wird jetzt eine Warnung generiert. Dies funktionierte jedoch nie wie beabsichtigt, schlug einfach still fehl.

Zum Erstellen mehrerer Sitzungen ist session_id() erforderlich. Schauen Sie sich diese verwandte Frage an: PHP Wie kann ich mehrere Sitzungen erstellen?

Sowohl session_name() als auch session_set_cookie_params() sind immer dann nicht vorhanden, wenn die Sitzung bereits läuft. 

Die ursprüngliche Antwort finden Sie hier: https://bugs.php.net/bug.php?id=75650&thanks=2

7
Blackbam

Ich hatte ein ähnliches Problem, fand aber schließlich einen Weg durch. Der folgende Code war mein erster Ansatz, der mir Fehler gab.

static function startmysession($lifetime, $path, $domain, $secure, $httponly){

    session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
    session_regenerate_id(true);

    if(!isset($_SESSION)){
        session_start();
    }
}

Frühere Versionen von php haben unseren Fehler übersehen (wir haben praktisch umbenannt und geben eine Sitzung, die bereits Eigenschaften enthält, die sehr falsch sind. Wie habe ich dieses Problem gelöst?)

static function startmysession($lifetime, $path, $domain, $secure, $httponly){      
    if(!isset($_SESSION)){  
         session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
         @session_regenerate_id(true);    
             session_start();
         }    
    }

Ich habe jetzt die session_set_cookie_params() kurz vor dem Start der Session gebunden und teste, ob die Session bereits existiert.

3
Miracool

TLDR: Wenn die Sitzung existiert, verwenden Sie setcookie(session_name(), session_id(), ...), andernfalls verwenden Sie session_set_cookie_params(...)

https://www.php.net/manual/en/function.session-set-cookie-params.php#100657

Da die Sitzungssteuerung von PHP die Sitzungslebensdauer bei Verwendung von session_set_cookie_params () nicht korrekt handhabt, müssen wir bei jedem Besuch unserer Site etwas tun, um die Ablaufzeit der Sitzung zu ändern. Also, hier ist das Problem.

<?php
  $lifetime=600;
  session_set_cookie_params($lifetime);
  session_start();
?>

Dieser Code ändert nicht die Lebensdauer der Sitzung, wenn der Benutzer auf unsere Website zurückkehrt oder die Seite aktualisiert. Die Sitzung läuft nach $ lifetime seconds ab, unabhängig davon, wie oft der Benutzer die Seite anfordert. Also überschreiben wir den Session-Cookie einfach wie folgt:

<?php
  $lifetime=600;
  session_start();
  setcookie(session_name(),session_id(),time()+$lifetime);
?>

Und jetzt haben wir das gleiche Session-Cookie, dessen Lebensdauer auf den richtigen Wert eingestellt ist.

Meine Lösung:

Ursprünglich:

        $cookieParams = session_get_cookie_params();

        session_set_cookie_params(
            $seconds,
            $cookieParams['path'],
            $cookieParams['domain'],
            $cookieParams['secure']
            );

Jetzt:

        if(isset($_SESSION)) {
            if ($seconds != 0) {
                setcookie(session_name(), session_id(), time() + $seconds);
            } else {
                setcookie(session_name(), session_id(), $seconds);
            }
        } else {
            $cookieParams = session_get_cookie_params();

            session_set_cookie_params(
                $seconds,
                $cookieParams['path'],
                $cookieParams['domain'],
                $cookieParams['secure']
            );
        }
1
Jayen