Update auf 4.10 Session verlust nach redirect via header()

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
snixzz
Beiträge: 18
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Update auf 4.10 Session verlust nach redirect via header()

Beitrag von snixzz » Mi 15. Jul 2020, 16:29

Liebe Contenido Community,

Ich arbeite erst seit kurzem mit Contenido und habe ein Projekt übernommen, welches kürzlich von V.4.9 auf V.4.10 upgedated wurde. Gleichzeitig wurde die PHP-Version von 7.2.31 auf 7.4.7 gestellt.

Seit dem Update verliere ich den $sess Inhalt bei einem redirect via header().

Hat jemand eine Idee wie ich dieses Problem lösen kann?

Liebe Grüsse,
Marco

Oldperl
Beiträge: 4160
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von Oldperl » Mi 15. Jul 2020, 18:25

Servus,

zuerst einmal willkommen im CONTENIDO-Forum. :)

Das könnte allein schon an der zu hohen PHP-Version liegen. Falls Du die umstellen kannst, solltest Du es mal mit max PHP 7.3 versuchen.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

xmurrix
Beiträge: 2982
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von xmurrix » Mi 15. Jul 2020, 22:00

Hallo Marco,

normalerweise beendet man direkt nach einer Weiterleitung die Ausführung weiteren Codes durch das hinzufügen von exit() oder die(). Das führt aber dazu, dass Änderungen in der Session nicht gespeichert werden. Das Speichern der Session geschieht am Ende des Frontend-Scriptes (contenido/includes/frontend/include.front_content.php) mit folgender Zeile:

Code: Alles auswählen

cRegistry::shutdown();
Eventuell löst es dein Problem, wenn du nach der Weiterleitung die Zeile einfügst, z. B.:

Code: Alles auswählen

header('Location: /redirect/url', true);
cRegistry::shutdown();
exit();
Bei einer Artikelweiterleitung, wird das schon so gehandhabt.

Falls du Probleme mit einem falsch gesetzten Cookie-Pfad haben solltest, hilft dir vielleicht folgender Beitrag dazu:
viewtopic.php?t=43499&p=179678#p179678

Grüße
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

snixzz
Beiträge: 18
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von snixzz » Do 16. Jul 2020, 07:19

Vielen Dank für die schnellen Antworten :D , leider hat dies das Problem nicht gelöst.

Vielleicht stimmt etwas mit dem Code nicht, ich werde den mal teilen. Hoffentlich hilft das weiter.

Speichern des Wertes in Session und redirect:

Code: Alles auswählen

<?php
	// Location/Rederict String
	$sSuccessPage = 'Location: ' . cUri::getInstance()->buildRedirect($aParams)."&amp;".$sess->name."=".$sess->id;
	
	// Wert in Session Speichern
	$sess->register("sCartFields");
	$sess->freeze();
	
	// Redirect
	header($sSuccessPage, true);
	cRegistry::shutdown();
	exit();
?>
Wert nach Redirect prüfen

Code: Alles auswählen

<?php
	$sess->isRegistered("sCartFields"); // ergibt false
?>
Mir ist noch aufgefallen, dass die ID in der URL von der ID der Session auf der Zielseite abweicht, weiss nicht ob euch das weiterhilft :)

xmurrix
Beiträge: 2982
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von xmurrix » Do 16. Jul 2020, 08:04

Folgende Punkte könntest du noch prüfen/beachten:
  • Die Variable $sCartFields ist als global zu deklarieren
  • cRegistry::shutdown(); ruft auch $sess->freeze() auf, eines von beiden reicht aus
  • Session-Name und Session-ID muss man nicht in der URL mit übergeben
  • Wird überhaupt ein Cookie gesetzt und ist der Cookie-Pfad korrekt? Wenn im Cookie-Pfad "/cms" steht, die Seite aber Clean-URLs ohne "/cms" am Anfang des URL-Pfades verwendet, wird das nicht funktionieren, siehe Anmerkung in vorheriger Antwort.
Folgender Code sollte funktionieren, wenn nicht, liegt es vermutlich am Cookie:

Code: Alles auswählen

<?php
    global $sCartFields;

    // Location/Rederict String
    $sSuccessPage = 'Location: ' . cUri::getInstance()->buildRedirect($aParams);

    // Wert setzen und in Session Speichern
    $sCartFields = 'test';
    $sess->register("sCartFields");

    // Redirect
    header($sSuccessPage, true);
    cRegistry::shutdown();
    exit();
?>
Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

snixzz
Beiträge: 18
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von snixzz » Do 16. Jul 2020, 08:56

xmurrix vielen Dank für die ausführliche Antwort.

Ich glaube wir kommen der Sache näher. Im Cookie steht wie du vermutet hast "/cms" und die Seite verwendet Clean-URLs. Auf dem Test-System (alte Version), welche auch noch funktioniert ist der Cookie-Pfad ohne "/cms".

Leider habe ich keine Berechtigung für den Link in deiner vorherigen Antwort bezüglich dem Cookie Pfad. Könntest du mir dazu noch Infos schicken?

Vielen Dank, ich hoffe das Thema hat sich bald erledigt :wink:


Liebe Grüsse,
Marco

xmurrix
Beiträge: 2982
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von xmurrix » Do 16. Jul 2020, 10:20

Ok, du kannst im Mandantenverzeichnis unter "cms/data/config/{environment}/", sofern "cms" das Mandantenverzeichnis ist, eine Datei "config.local.php" anlegen, das folgenden Inhalt hat:

Code: Alles auswählen

<?php
global $cfg;

if (empty($cfg)) {
    $cfg = [];
}
if (empty($cfg['cookie'])) {
    $cfg['cookie'] = [];
}
$cfg['cookie']['path']= '/';
Das geht auch Systemweit, also für das Frontend aller Mandanten, unter "data/config/{environment}/", mit einer Datei "config.local.php", die den gleichen Inhalt hat.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

snixzz
Beiträge: 18
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von snixzz » Do 16. Jul 2020, 10:54

Jetzt läufts wieder! Vielen Dank xmurrix.

Weisst du vielleicht auch wieso der Fehler seit dem Update aufgetaucht ist?

Soweit ich weiss haben wir den Cookie-Pfad in der alten Version nie so definiert.

Liebe Grüsse,
Marco

xmurrix
Beiträge: 2982
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von xmurrix » Do 16. Jul 2020, 12:20

snixzz hat geschrieben:
Do 16. Jul 2020, 10:54
...Jetzt läufts wieder! Vielen Dank xmurrix.

Weisst du vielleicht auch wieso der Fehler seit dem Update aufgetaucht ist?...
Keine Ursache.

Zwischen CONTENIDO 4.9 und 4.10 wurde irgendwann das Setzen des Cookie-Pfades überarbeitet. Früher wurde versucht, den Cookie-Pfad zum Frontend automatisch zu ermitteln und zu setzen. Aber das geht nicht einfach, da es je nach Anforderung anders sein kann. Daher gibt es die Möglichkeit, dies per Konfiguration zu setzen.

Per default wird dafür der Pfad der Frontend-URL, z. B. das "/cms" aus "https://domain.com/cms", verwendet. Das ist bei einem Mehrmandantensystem, das unter der gleichen Domain läuft aber unterschiedliche Mandantenordner hat, sehr wichtig. Falls man aber mit Clean-URLs arbeitet, und diese nicht mit dem Mandantenordner (z. B. "/cms") im Pfad der URL beginnen, so kann man das nun konfigurieren.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

mikedreissig
Beiträge: 45
Registriert: Di 10. Jan 2006, 19:28
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von mikedreissig » Mi 2. Dez 2020, 09:46

Hallo Gemeinde,
ich habe ein ähnliches Problem, nach Update von 4.9.12 auf 4.10.0 werden angemeldete Frontenduser nach Klick auf einen Menüpunkt im passwortgeschützten Frontendbereich aus diesem herausgeworfen. Das liegt definitiv am Cookie-Pfad, denn ohne AMR passiert das nicht. Ich habe die Lösung von xmurrix eingebaut (config.local.php), aber das System weigert sich stoisch den Cookie-Pfad von "/cms" auf "/" zu setzen. Eine Ausgabe von "$cfg['cookie']['path']" in meinem Modul ergibt aber "/". Weiß jemand Rat?

Grüße
mikedreissig

xmurrix
Beiträge: 2982
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von xmurrix » Mi 2. Dez 2020, 11:49

Hallo mikedreissig,
...aber das System weigert sich stoisch den Cookie-Pfad von "/cms" auf "/" zu setzen. Eine Ausgabe von "$cfg['cookie']['path']" in meinem Modul ergibt aber "/". Weiß jemand Rat?...
Der Pfad zum Cookie wird in der Datei contenido/classes/class.session.php (Zeile 90 ff) ermittelt, der Code dafür sieht so aus:

Code: Alles auswählen

        $path = parse_url($url, PHP_URL_PATH);
        $path = cRegistry::getConfigValue('cookie', 'path', $path);
        if (empty($path)) {
            $path = '/';
        }
Du müsstest also herausfinden, warum die Zeile

Code: Alles auswählen

        $path = cRegistry::getConfigValue('cookie', 'path', $path);
bei dir nicht den Wert aus deiner "$cfg['cookie']['path']" liefert.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

mikedreissig
Beiträge: 45
Registriert: Di 10. Jan 2006, 19:28
Kontaktdaten:

Re: Update auf 4.10 Session verlust nach redirect via header()

Beitrag von mikedreissig » Mi 2. Dez 2020, 12:07

Hallo xmurrix,
erstmal danke für Deine schnelle Antwort!

Dies hier war der entscheidende Hinweis:
$path = cRegistry::getConfigValue('cookie', 'path', $path);
Das existiert in contenido/classes/class.session.php in der Version 4.10.0 noch gar nicht, sondern erst ab 4.10.1

Habe ein Update durchgeführt und nun läuft es rund.

Ich liebe dieses Forum!
mikedreissig

Antworten