Session Problem bei ausgeschalteten Cockies
Session Problem bei ausgeschalteten Cockies
am 16.10.2006 18:30:07 von steiniman
hallo,
ich habe ein Problem mit der Session, wenn die Cockiefunktion komplett
deaktiviert (Firefox) oder beim IE auf Hoch/Blockiert eingestellt wird.
Dies ist mir jetzt auch erst durch die Logfile aufgefallen, die
ungefähr so aussieht:
84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET / HTTP/1.1" 200 5
sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;
..NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
/main/index.php?STLid=3D5480765cb25e0fa9bf2198d4a3c81eaa HTTP/1.1" 302
3482 sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
51; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
/index.php?STLid=3D1b437dc09b0ab98ede310054ef713738 HTTP/1.1" 302 5
sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;
..NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
/main/index.php?STLid=3Dcbb28b3a877ffb31ba3b52627ff4b4b6 HTTP/1.1" 302
3482 sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
51; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
....
Die Index-Datei im root sieht gekürzt so aus:
....
/*===================3D= 3D=====
==================== =====3D=
==========*/
require ('./.../session.php');
$s2 =3D session_name().'=3D'.session_id();
header('location:./main/index.php?'.$s2);
/*===================3D= 3D=====
==================== =====3D=
==========*/
....
die passende session.php sieht so aus:
....
/*===================3D= 3D=====
==================== =====3D=
==========*/
session_start();
$lsid =3D session_id();
$sidn =3D session_name();
/*===================3D= 3D=====
==================== =====3D=
==========*/
if($_GET["STLid"]<>$lsid)
{ if($_POST["STLid"]<>$lsid)
{
session_name('STLid');
@session_start();
$sid =3D session_id();
header('location:../index.php?STLid=3D'.$sid);
}
}
/*===================3D= 3D=====
==================== =====3D=
==========*/
if ($sidn <>'STLid') {$sidn =3D 'STLid'; session_name('STLid');}
@session_start();
$sid =3D session_id();
/*===================3D= 3D=====
==================== =====3D=
==========*/
.....
die index-Datei im Verzeichnis main greift ebenfalls auf die
session.php zu.
Irgendwo muss ich einen logischen Gedankensprung haben, denn angeblich
sollte dies doch ohne lokale Cockies funktionieren... hat jemand einen
Tipp, wie das Problem gelöst werden kann?
Vielen Dank im vorraus.
Re: Session Problem bei ausgeschalteten Cockies
am 16.10.2006 20:32:32 von Ulf Kadner
steiniman wrote:
Schreib mal Deinen vollständigen Namen hin bitte. Gehört sich so hier!
> ich habe ein Problem mit der Session, wenn die Cockiefunktion komplett
> deaktiviert (Firefox) oder beim IE auf Hoch/Blockiert eingestellt wird.
> Dies ist mir jetzt auch erst durch die Logfile aufgefallen, die
> ungefähr so aussieht:
> ...
>
> Die Index-Datei im root sieht gekürzt so aus:
> require ('./.../session.php');
> $s2 = session_name().'='.session_id();
> header('location:./main/index.php?'.$s2);
der header ist unzulässig! ein Location-header darf *nur* eine absolute
URL darstellen (also http://...) es ist egal obs gerad funktioniert.
> session_start();
> $lsid = session_id();
> $sidn = session_name();
> if($_GET["STLid"]<>$lsid)
Du must immer erst prüfen ob die zu nutzende Variable auch existiert!
isset($_GET['STLid']). Dei Code erzeugt mehrere Fehler-notizen.
> session_name('STLid');
Warum läst Du nicht PHP die Arbeit mit den Sessions machen? Passiert
doch alles von allein. (wenn man will)
> Irgendwo muss ich einen logischen Gedankensprung haben, denn angeblich
> sollte dies doch ohne lokale Cockies funktionieren... hat jemand einen
Du meinst sicher clientseitige Cookies
> Tipp, wie das Problem gelöst werden kann?
Ja welches Problem hast Du denn genau? Nur wenn Cookies aktiviert sind
wird die SessionID automatisch im Cockie weitergegenen, ist ja logisch.
Was anderes braucht mein eigentlich auch nicht. YMMV
Ich bau meine Anwendungen so auf, das Sessiondaten nur dort zwingend
genutzt werden wo man auch vom Nutzer verlangen kann das er Kekse
aktiviert hat (etwa Loginbereiche o.ä.)
Was fehlt Denn Deier meinung nach? Und wo? verstehe nicht ganz.
MfG, Ulf
Re: Session Problem bei ausgeschalteten Cockies
am 16.10.2006 22:30:52 von steiniman
Ulf Kadner schrieb:
> steiniman wrote:
>
> Schreib mal Deinen vollständigen Namen hin bitte. Gehört sich so hier!
So, dürfte nun richtig eingestellt sein... sorry...
> > header('location:./main/index.php?'.$s2);
>
> der header ist unzulässig! ein Location-header darf *nur* eine absolute
> URL darstellen (also http://...) es ist egal obs gerad funktioniert.
ok, wird umgeschrieben...
>
> > session_start();
> > $lsid =3D session_id();
> > $sidn =3D session_name();
> > if($_GET["STLid"]<>$lsid)
>
> Du must immer erst prüfen ob die zu nutzende Variable auch existiert!
> isset($_GET['STLid']). Dei Code erzeugt mehrere Fehler-notizen.
>
> > session_name('STLid');
>
Das muss ich mir noch mal in Ruhe anschauen.
> Warum läst Du nicht PHP die Arbeit mit den Sessions machen? Passiert
> doch alles von allein. (wenn man will)
naja, nu is zuspät, ich müsste überall die Links nachbearbeiten, und
das sind nicht wenige...
> > sollte dies doch ohne lokale Cockies funktionieren... hat jemand einen
>
> Du meinst sicher clientseitige Cookies
ja, das meinte
>
> > Tipp, wie das Problem gelöst werden kann?
>
> Ja welches Problem hast Du denn genau? Nur wenn Cookies aktiviert sind
> wird die SessionID automatisch im Cockie weitergegenen, ist ja logisch.
der springt bei abgeschalteten Cookies immer zwischen der index.php
(root) und index.php (./main) hin und her und erstellt immer wieder
neue Session-IDs. Nach meinen Gedankengang dürfte dies aber nicht
passieren, weil er doch diese (wie in der Logfile ersichtlich) an der
URL anhängt. Und bei niedriger Datenschutzeinstellung funktioniert das
ganze ja auch so, wie dies soll, deshalb stutze ich...
>
> Was anderes braucht mein eigentlich auch nicht. YMMV
> Ich bau meine Anwendungen so auf, das Sessiondaten nur dort zwingend
> genutzt werden wo man auch vom Nutzer verlangen kann das er Kekse
> aktiviert hat (etwa Loginbereiche o.ä.)
Es werden ja diverse Daten mitgeschleift, die öfters (teilweise, aber
nicht immer) abgefragt und geändert werden...
MfG
Jens
Re: Session Problem bei ausgeschalteten Cockies
am 17.10.2006 16:46:36 von Alex Hepp
Jens Steinführer schrieb:
> Ulf Kadner schrieb:
>>> header('location:./main/index.php?'.$s2);
>> der header ist unzulässig! ein Location-header darf *nur* eine absolute
>> URL darstellen (also http://...) es ist egal obs gerad funktioniert.
>
> ok, wird umgeschrieben...
>
>>> session_start();
An dieser Stelle versucht php eine alte Session wiederherzustellen, dazu
liest es entweder das Cookie (man beachte auch bitte die Schreibweise ;)
) aus, und wenn das nich vorhanden ist, liest es den eingestellten
SessionID Parameter aus. Ist beides nicht vorhanden, startet PHP eine
neue Session (mit einer neuen ID)...
>>> $lsid = session_id();
Diese Funktion gibt Dir dann die ID der eben gestarteten oder eben
wiederhergestellten Session zurück!
>>> $sidn = session_name();
>>> if($_GET["STLid"]<>$lsid)
>>
>>> session_name('STLid');
>>> Tipp, wie das Problem gelöst werden kann?
>> Ja welches Problem hast Du denn genau? Nur wenn Cookies aktiviert sind
>> wird die SessionID automatisch im Cockie weitergegenen, ist ja logisch.
Also meiner Meinung nach (auch wenn ich, ähnlich wie Ulf, nicht
verstehe, warum 1. nicht der Standardname für die SessionID, und 2. Du
nicht automatisch PHP die Links ändern lässt) ist das Problem, dass Du
zwar vielleicht den SessionNamen änderst, allerdings PHP bei
SessionStart noch nicht weiss, dass der Parametername für die ID in der
URL eben STLid ist. Da ich das allerdings selbst noch nie so gemacht
habe(hab eben einfach immer den Standardnamen verwendet), kann ich Dir
leider auch nicht sagen, ob Du nun vor session_start() session_name()
aufrufen musst, oder gar per ini_set den wert für session.name umstellen
musst...
Aber ein bisschen googlen und ausprobieren sollte helfen...
HTH.
Alex
Re: Session Problem bei ausgeschalteten Cockies
am 17.10.2006 20:21:50 von dafox
steiniman schrieb:
> ich habe ein Problem mit der Session, wenn die Cockiefunktion komplett
> deaktiviert (Firefox) oder beim IE auf Hoch/Blockiert eingestellt wird.
> Dies ist mir jetzt auch erst durch die Logfile aufgefallen, die
> ungefähr so aussieht:
> 84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET / HTTP/1.1" 200 5
> sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;
> .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
> 84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
> /main/index.php?STLid=5480765cb25e0fa9bf2198d4a3c81eaa HTTP/1.1" 302
> 3482 sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
> 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
> 84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
> /index.php?STLid=1b437dc09b0ab98ede310054ef713738 HTTP/1.1" 302 5
> sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;
> .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
> 84.182.61.159 - - [16/Oct/2006:17:15:11 +0200] "GET
> /main/index.php?STLid=cbb28b3a877ffb31ba3b52627ff4b4b6 HTTP/1.1" 302
> 3482 sachsennetz.de "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
> 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "-"
Und wo ist das Problem? Das ist genau das, was dein Code produziert,
allerdings nicht wenn Cookies deaktiviert sind, sondern wenn sie
aktiviert sind.
> Die Index-Datei im root sieht gekürzt so aus:
> require ('./.../session.php');
> $s2 = session_name().'='.session_id();
> header('location:./main/index.php?'.$s2);
header('Location: http://sachsennetz.de/main/index.php?' . SID);
> die passende session.php sieht so aus:
> session_start();
> $lsid = session_id();
> $sidn = session_name();
> if($_GET["STLid"]<>$lsid)
> { if($_POST["STLid"]<>$lsid)
> {
> session_name('STLid');
Das session_name() musst du *vor* dem ersten session_start() aufrufen,
sonst bringt es nichts. Ausserdem verstehe ich nicht ganz, was diese
Abfrage hier überhaupt soll.
Wenn die Session-Id per Cookie propagiert wird, dann ist weder
$_GET['STLid'] noch $_POST['STLid'] gesetzt und demnach wirst du
umgeleitet, da null <> $lsid.
Hättest du das Error-Reporting-Level justiert, wäre dir das aufgefallen.
> @session_start();
Das ist an dieser Stelle sinnlos, da die Session sowieso schon gestartet
oder wieder aufgenommen wurde.
> $sid = session_id();
> header('location:../index.php?STLid='.$sid);
> }
> }
> /*========================================================== =*/
> if ($sidn <>'STLid') {$sidn = 'STLid'; session_name('STLid');}
> @session_start();
> $sid = session_id();
> /*========================================================== =*/
So sollte deine session.php aussehen:
session_name('STLid');
session_start();
?>
Das ganze andere Geraffel brauchst du nicht. Und 3x session_start() in
einer Datei ist unnötig. Du machst es dir selbst kompliziert.
> Irgendwo muss ich einen logischen Gedankensprung haben, denn angeblich
> sollte dies doch ohne lokale Cockies funktionieren... hat jemand einen
> Tipp, wie das Problem gelöst werden kann?
Ja, verwende Sessions so, wie es im Manual beschrieben ist, dann hast du
das Problem erst gar nicht.
Re: Session Problem bei ausgeschalteten Cockies
am 18.10.2006 19:14:57 von steiniman
hallo,
erstmal Danke für die Hinweise, die mir schon weiter geholfen haben.
Thomas 'DaFox' Hamacher wrote:
> Das session_name() musst du *vor* dem ersten session_start() aufrufen,
> sonst bringt es nichts. Ausserdem verstehe ich nicht ganz, was diese
> Abfrage hier überhaupt soll.
ok, das wurde geändert
> Wenn die Session-Id per Cookie propagiert wird, dann ist weder
> $_GET['STLid'] noch $_POST['STLid'] gesetzt und demnach wirst du
> umgeleitet, da null <> $lsid.
ich hab ja die Session-ID ja immer in der URL oder im Formular drin,
also müsste die doch auch immer, egal, wie die Clienteinstellung ist,
immer als normale Variable ausgelesen werden, oder nicht?
> > $sid =3D session_id();
> > header('location:../index.php?STLid=3D'.$sid);
> > }
> > }
> > /*===================3D= 3D===3D=
==================== =====3D=
===========3D*/
> > if ($sidn <>'STLid') {$sidn =3D 'STLid'; session_name('STLid');}
> > @session_start();
> > $sid =3D session_id();
> > /*===================3D= 3D===3D=
==================== =====3D=
===========3D*/
>
> So sollte deine session.php aussehen:
>
>
> session_name('STLid');
> session_start();
> ?>
>
> Das ganze andere Geraffel brauchst du nicht. Und 3x session_start() in
> einer Datei ist unnötig. Du machst es dir selbst kompliziert.
Das weitergehende Geraffel soll ja bei Nichtvorhandensein und alten
Session-IDs (die abgelaufen sind - z.B. Favortienliste) eine neue ID
erstellen UND explizit auf die index.php im Root setzen, um von dort
aus weiter verarbeitet zu werden.
Nach der Änderung des Scriptes, wie geschrieben, wird die alte Session
wieder neu erstellt, auch wenn sie aus dem Session-Ordner schon
entfernt wurde...
> Ja, verwende Sessions so, wie es im Manual beschrieben ist, dann hast du
> das Problem erst gar nicht.
Das Manual beschreibt jedoch nicht so ein Anwendungsbeispiel.
Re: Session Problem bei ausgeschalteten Cockies
am 18.10.2006 21:54:01 von dafox
Jens Steinführer schrieb:
> Thomas 'DaFox' Hamacher wrote:
>> Wenn die Session-Id per Cookie propagiert wird, dann ist weder
>> $_GET['STLid'] noch $_POST['STLid'] gesetzt und demnach wirst du
>> umgeleitet, da null <> $lsid.
> ich hab ja die Session-ID ja immer in der URL oder im Formular drin,
> also müsste die doch auch immer, egal, wie die Clienteinstellung ist,
> immer als normale Variable ausgelesen werden, oder nicht?
Wenn sie immer drin ist, ja. Hab ich wohl überlesen.
>> Das ganze andere Geraffel brauchst du nicht. Und 3x session_start() in
>> einer Datei ist unnötig. Du machst es dir selbst kompliziert.
> Das weitergehende Geraffel soll ja bei Nichtvorhandensein und alten
> Session-IDs (die abgelaufen sind - z.B. Favortienliste) eine neue ID
> erstellen UND explizit auf die index.php im Root setzen, um von dort
> aus weiter verarbeitet zu werden.
Ok, verstehe. Also sähe deine session.php dann so aus:
session_name('STLid');
session_start();
if(isset($_REQUEST['STLid']) && $_REQUEST['STLid'] != session_id()) {
session_regenerate_id();
header('Status: 302 Found');
header('Location: http://sachsennetz.de/main/index.php?' . SID);
exit(0);
}
?>
> Nach der Änderung des Scriptes, wie geschrieben, wird die alte Session
> wieder neu erstellt, auch wenn sie aus dem Session-Ordner schon
> entfernt wurde...
Genau dafür gibt es session_regenerate_id().