PHP Daten einer alten Session laden?

schlumsch

Cadet 4th Year
Registriert
Feb. 2008
Beiträge
73
Hallo,

ich habe als Projekt einen Onlineshop und dort das Problem, dass eine Sessionübernahme problemlos möglich ist. Gibt man also einen Link an einen anderen nutzer weiter, so erhält der andere nutzer ohne Weiteres alle informationen aus Warenkorb etc. ... ist natürlich nicht Sinn der Sache.

Nun sollen keine Cookies verwendet werden, was mich zu der Überlegung bringt die IP des users im Sessionfile auf dem Server zu speichern. In den Links des Shops wird jeweils die Sessionid mit übergeben, nun müsste ich quasi "nur" das entsprechende Sessionfile laden und dort die gespeicherte IP ermitteln.

Speichern der IP im Sessionfile ist kein Problem, nur mit dem laden einer alten Session und dem Auslesen von Daten komme ich nicht klar, zugegebener Maßen.

Zum Test habe ich einfach einen String in die aktuelle Session gepumpt

Code:
$lmsmass = 'lickMyShinyMetalA**';    
         session_register('lmsmass');

Ich habe den folgenden Code gefunden (php.net), welchen man sicher verwenden kann. Was ist $session_string ?
Ich habe eine session_id und einen session_name, in der url staht also http....&meineid=123456sdf... was genau wird hier benötigt?


Wie kann ich aus $restored_session meine Variable laden?

Code:
function decode_session($session_string){
    // keep original (current) session in $current_session
    $current_session = session_encode();
    // destroy original sessiondata
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }
    // load new sessiondata
    session_decode($session_string);
    // keep new loaded sessiondata in variable $restored_session
    $restored_session = $_SESSION;
    // destroy actual (reloaded) sessiondata
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }

Kann mir da jemand helfen?
 
schlumsch schrieb:
Was ist $session_string ?
ist die alte session. wie du siehst wird session_decode() aufgerufen und was diese macht, kann man imo am namen ableiten.
schlumsch schrieb:
Ich habe eine session_id und einen session_name, in der url staht also http....&meineid=123456sdf... was genau wird hier benötigt?
die alte session mittels session_encode().
schlumsch schrieb:
Wie kann ich aus $restored_session meine Variable laden?
die sollte dann afaik in $_SESSION zu finden sein (laut beschreibung von session_decode()).
 
Ok, aber wie komme ich nun an die (evtl.) alte Session heran? Also ich habe eine url aus welcher ich die sessionid extrahieren kann. Ich habe sessionfiles mit dem namen "sess_sessionid". Wie kann ich diese Session mittels session_encode kodieren und an meine Procedure übergeben??
Ergänzung ()

Ich kann nun mittlerweile die alte Session laden und mir auch erfolgreich die gespeicherte Variable holen.
Code:
$currentSession = session_encode();
session_destroy();
tep_session_name('sessionname');
tep_session_id('12345');
tep_session_start();
echo session_encode();

Nun muss ich dabei allerdings meine derzeitige session terminieren. Um das zu vermeiden würde ich ganz gerne die oben angeführte function decode_session benutzen.

Wie baue ich nun aber den session_String meiner alten Session aus dem Sessionnamen und der Sessionid? Ich muss diesen ja vorher mit session_encode erzeugen.
 
schlumsch schrieb:
Wie baue ich nun aber den session_String meiner alten Session aus dem Sessionnamen und der Sessionid? Ich muss diesen ja vorher mit session_encode erzeugen.
die alte session bekommst du nur im ganzen und kannst sie auch nur im ganzen abspeichern. die alte session muss dazu auch nicht gelöscht werden (es reicht ja wenn du ne kopie der aktuellen machst und beide im nachhinein zusammenführst bzw. aktualisierst). aber wieso störst du dich überhaupt daran? session-angelegenheiten sollten doch sowieso nur am anfang des scripts vor jeglicher ausgabe kommen, sodass der user davon überhaupt gar nix mitbekommt.

was kommt denn raus, wenn du die aktuelle session unangetastet lässt und die alte über session_decode() ausliest? wird die aktuelle dann verworfen und die alte übernommen oder werden beide migriert? wenn das passiert, mach doch wie gesagt einfach n backup der aktuellen session, integriere die alte und übernimm die wichtigen felder der aktuellen session einfach, sodass sie noch gültig ist. geht ganz einfach mittels
PHP:
$abc = $_SESSION;
und danach machst du die session wieder aktuell (mittels session id und was man dazu noch braucht).
 
Also, mein Problem liegt derzeit immernoch darin die late session mit session_decode(s_str) zu laden. Warscheinlich verstehe ich da etwas nicht, wie genau erzeuge ich denn s_str??? Das s_str eine vorher kodierte Session ist ja klar, nur wie komme ich eben genau da ran??
 
schlumsch schrieb:
Das s_str eine vorher kodierte Session ist ja klar, nur wie komme ich eben genau da ran??
die übergabe erwartet einen string der session, welche mittels session_encode() gespeichert wurde. der rest liegt an dir wo du die session nun speicherst. sessions werden von haus aus auch nur temporär angelegt, solange sie gültig sind. speicher dir die alten sessions also irgendwohin und ruf sie bei gegebenheit wieder ab.
 
Ok, also folgende Situation: Ich bekomme eine url übergeben welche eine Sessionid hat. Nun schneide ich die Sessionid ab, öffne das gleichnamige Sessionfile welches auf meinem Server liegt und hole mir dort bestimmte Werte heraus. Diese Werte vergleiche ich dann mit meinen Werten meiner aktuellen Session und entscheide daraufhin ob ich den url-Aufruf akzeptiere oder nicht. ... soweit die Theorie.
Zur Praxis:
Sessionid aus der url holen : kein Problem.
Nun der Knackpunkt: ich habe ein gleichnamiges Sessionfile...
die übergabe erwartet einen string der session, welche mittels session_encode()
Das bedeutet ich muss die alte Session mittels session_encode() kodieren. Wie mache ich das wenn ich nur das Sessionfile habe? Das ist mein Problem. Quasi wie erhalte ich den String?

(Wenn ich meine aktuelle Session destroye, eine neue Sessionid (eben die o.g. "alte") und Sessionnamen setze, die Session starte, diese encode geht das... aber ich will meine aktuelle Session ja nicht destroyen.)

Sorry wenn ich das etwas verreiße und es einfach nicht verstehe,

lg
 
ich versteh überhaupt nicht, wo genau dein problem ist.
eine session übernahme ist generell nicht möglich, da jedem nutzer beim aufruf deines shops mit session_start eine session zugewiesen wird.
nun kann man dem server beibringen, das er die session id ueber die url erhält.
gibt man den link weiter an einen freund, so wird beim aufruf der seite eine neue session id erstellt, welche natürlich von der aus dem link abweicht.
und wieso nutzt du überhaupt sessions für den warenkorb, serverseitige datenablage ist sinvoll bei sensiblen nutzerdaten, wie benutzernamen und passwort, aber nicht beim warenkorb.
das einzige was du dort zu speichern hättest wäre artikel id und menge.
oder bin ich grad bisschen dumm am morgen?
 
Nun, das Problem bei der ganzen Geschichte ist das ich den Shop vorgesetzt bekommen habe und das Projekt schon seit Jahren läuft. Ich bin quasi nicht an der Entscheidung beteiligt gewesen welche Daten wie und wo gehalten werden. Zudem fehlt die Zeit das ganze Ding umzuprogrammieren... zugegebener Maßen mangelt es auch an Lust meinerseits :)

Derzeit ist es einfach so, das man bei Übergabe eines Linkes an eine andere Person sowohl den Warenkorb des Senders erhält... aber noch viel krasser: man ist ebenfalls eingeloggt *g*
Keine Ahnung was sich der Erfinder dabei gedacht hat... mir würde es genügen ID, Benutzername und PW aus dem zur übergebenen SessionID gehörigen Sessionfile zu laden und zu prüfen.
 
okay, das ist natürlich tragisch :X.
viel weiterhelfen kann man dir da leider auch nicht, es scheint aufjedenfall an einer groben fehlprogrammierung im bezug auf die sessions zu liegen :(

alles was du vom prinzip brauchst ist session_start(); vorm header der index datei.
eine kontrolle auf existenz einer session und eine kontroll instanz, die ausgefuehrt wird, wenn sich jm. versucht über das menü einzuloggen. das wars.
session id uebergeb ich persönlich über die url. kann man aber auch lassen, je nachdem wie man den server eingestellt hat.
 
Zuletzt bearbeitet:
Okay aber ich lenke dennoch mal an dieser Stelle den Blickpunkt wieder auf mein Posting #7 ... (Sorry, ich will hier jetzt keine Diskussion über das prinzipielle Vorgehen und wie es besser zu machen wäre da ich froh bin wenn ich das Projekt los bin :) )
 
Zurück
Oben