2009-03-04 6 views
10

Ich habe zwei Apps, die ich vereinheitlichen möchte. Einer wurde von mir geschrieben und ein anderer ist ein CMS, den ich benutze. Meine Authentifizierung erfolgt in dem, den ich codiert habe, und ich möchte, dass mein CMS diese Informationen kennt. Das Problem besteht darin, dass das CMS einen Sitzungsnamen verwendet und meine App ein anderes verwendet. Ich möchte nicht, dass sie wegen möglicher Namespace-Konflikte denselben verwenden, aber ich möchte trotzdem diese Informationen erhalten.Können Sie PHP-Sitzungen in einer Sitzung wechseln?

Ist es möglich, Sitzungsnamen mitten in einer Anfrage zu wechseln? Zum Beispiel, so etwas in der CMS zu tun:

//session_start already called by cms by here 

$oldSession = session_name(); 
session_name("SESSION_NAME_OF_MY_APP"); 
session_start(); 

//get values needed 
session_name($oldSession); 
session_start(); 

Würde so etwas funktionieren? Ich kann nichts in den Dokumenten oder im Internet finden, wenn so etwas nach dem Aufruf von session_start() funktionieren würde. Tipps?

Um diese Lösung zu umgehen, habe ich in Betracht gezogen, nur einen Webdienst zu entwickeln, um die Informationen zu erhalten, aber es wäre besser, sie einfach aus der Sitzung zu holen, da diese Informationen bereits verfügbar sind.

Danke!

Antwort

0

Sie sollten session_id verwenden, Sie können es verwenden, um die Sitzungs-ID (oder den Namen) festzulegen/abzurufen.

Verwenden Sie also statt session_name (in Ihrem Pseudocode) session_id.

1

session_regenerate _id()

Das Handbuch erklärt ziemlich gut dies aber hier einige Beispiele aus dem Handbuch

session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
+0

das sieht nach einer guten Wette aus ... Ich werde es versuchen! –

+3

-1: Dies ändert nur die Sitzungs-ID, aber die Sitzung ist immer noch die gleiche. – hakre

0

Zend_Session bietet für Sitzungen von Namensräumen.

Zend_Session_Namespace Instanzen sind Zugriffsobjekte für benannte Abschnitte von $ _SESSION. Die Zend_Session Komponente wickelt die bestehende PHP ext/session mit einer Verwaltung und Management-Schnittstelle sowie eine API für Zend_Session_Namespace Bereitstellung Sitzung Namensraum bestehen bleiben. Zend_Session_Namespace bietet eine standardisierte, objektorientierte Schnittstelle für die Arbeit mit Namespaces persisted in PHP Standard Session-Mechanismus. Unterstützung existiert für sowohl anonyme als auch authentifizierte (z. B. "Login") Session-Namespaces.

0

Es ist möglich. Aber ich glaube, Sie haben die Sitzung zu tun Umgang mit sich selbst:

session_name('foo'); 
// start first session 
session_start(); 

// … 

// close first session 
session_write_close(); 

session_name('bar'); 
// obtain session id for the second session 
if (ini_get('session.use_cookies') && isset($_COOKIE[session_name()])) { 
    session_id($_COOKIE[session_naem()]); 
} else if (ini_get('session.use_trans_sid') && !ini_get('session.use_only_cookies') && isset($_REQUEST[session_name()])) { 
    session_id($_REQUEST[session_naem()]); 
} 
// start second session 
session_start(); 

// … 

Aber beachten Sie, dass Sie auch einige der anderen Session Handling Dinge wie Cookie-Einstellung tun könnte. Ich weiß nicht, ob PHP das auch in diesem Fall tut.

3

Hinweis: Die Antwort unten ist nicht korrekt, bitte verwenden Sie nicht oder stimmen Sie nicht ab.Ich habe es hier als Ort für die Diskussion

Sie Lösung sollte funktionieren (nicht, dass ich jemals so etwas versucht), außer dass Sie die vorherige Sitzung vor jedem Anruf auf session_name() manuell schließen müssen, da sonst wird lautlos versagen.

Sie können so etwas wie dies versuchen:

session_write_close(); 
$oldsession = session_name("MY_OTHER_APP_SESSION"); 
session_start(); 

$varIneed = $_SESSION['var-I-need']; 
session_write_close(); 
session_name($oldsession); 
session_start; 

Es gibt keine Notwendigkeit, tatsächlich Chaos mit dem Session-ID-Wert, entweder durch PHP-Session-ID-Manipulation Routinen oder durch manuelle Cookie Mangeln - PHP wird von allen kümmern, dass selbst und du solltest dich damit nicht anfreunden.

+1

Es scheint mir, Sie können mit zwei verschiedenen Session-Namen, die die gleiche ID haben. In diesem Fall teilen beide Sitzungen die gleichen Daten, auch wenn sie unterschiedliche Namen haben. Um das zu vermeiden, möchten Sie vielleicht mit der Session-ID nach ... – commonpike

+1

Ich sehe nicht, wie das passieren könnte - es sei denn, Sie gehen davon aus, dass zwei verschiedene Clients die gleiche Session-ID "versehentlich" erhalten. Das liegt daran, dass session_name() so funktioniert, dass es ändert, welchen Cookie PHP zur Identifizierung der Sitzung verwendet. Wenn dies dazu führt, dass Sie eine neue Sitzung erstellen (anstatt eine vorhandene zu laden), garantiert PHP, dass es eine neue verwendet Sitzungs-ID - sonst wird es leicht, Sitzungen zu entführen. – Guss

+0

Auch das Herumspielen mit der Sitzungs-ID ist ein sicherer Weg, um Löcher für Session-Hijacker zu öffnen. Wenn Sie sich mit Session-IDs herumschlagen (bitte nicht), gehen Sie nicht davon aus, dass Sie wissen, wie man Session-IDs generiert und verwenden Sie immer 'session_regenerate_id()'. – Guss

6

Hier ist ein funktionierendes Beispiel, wie zwischen den Sitzungen wechseln:

session_id('my1session'); 
session_start(); 
echo ini_get('session.name').'<br>'; 
echo '------------------------<br>'; 
$_SESSION['value'] = 'Hello world!'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my2session'); 
session_start(); 
$_SESSION['value'] = 'Buy world!'; 
echo '------------------------<br>'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my1session'); 
session_start(); 
echo '------------------------<br>'; 
echo $_SESSION['value']; 

Log wird wie folgt aussehen:


PHPSESSID 
------------------------ 
my1session 
Hello world! 
------------------------ 
my2session 
Buy world! 
------------------------ 
Hello world!

So, wie Sie sehen können, Session-Variablen gespeichert und wiederhergestellt, während Sitzung zu ändern.

+3

Bitte verwirren Sie nicht die Sitzungs-ID manuell - das unterscheidet einen Benutzer von dem anderen. Wenn Sie die Sitzungs-IDs manuell ändern, können Sie Session-Hijacking durchführen, und das - für Uneingeweihte - ist ** schlecht **. – Guss

+0

Anstatt session_id manuell zu setzen, können Sie 'session_regenerate_id()' aufrufen (aber Sie müssen es nach dem zweiten 'session_start()' tun). Wenn Sie diese Änderung vornehmen und beide Aufrufe von 'session_id()' aus Ihrem Code entfernen, erhalten Sie den gleichen Effekt, ohne die Sitzungs-IDs zu stören.Beachten Sie, dass dies keine alte Sitzung lädt - alle Daten, die in der "zweiten Sitzung" vorhanden sind, sind identisch mit der ersten Sitzung - es verhindert einfach, dass die neuen Daten in die alte Sitzung geschrieben werden. Es sieht wie ein Anfang aus, einen eigenen Mechanismus für die Verwaltung austauschbarer Sitzungen zu erstellen. – Guss

2

Ich habe daran gearbeitet, dies zu perfektionieren und hier ist, was ich mir ausgedacht habe. Ich wechsle zu einer Elternsitzung, indem ich Sitzungsnamen in meinen Kind-Apps und dann zurück zur Sitzung meiner Kind-App verwende. Die Lösung erstellt die übergeordnete Sitzung, wenn sie nicht existiert.

$current_session_id = session_id(); 
$current_session_name = session_name(); 

session_write_close(); 

$parent_session_name = 'NameOfParentSession'; 

// Does parent session exist? 
if (isset($_COOKIE[$parent_session_name])) { 

    session_id($_COOKIE[$parent_session_name]); 
    session_name($parent_session_name); 
    session_start(); 

} else { 
    session_name($parent_session_name); 
    session_start(); 

    $success = session_regenerate_id(true); 
} 

$parent_session_id = session_id(); 

// Do some stuff with the parent $_SESSION 

// Switch back to app's session 
session_write_close(); 
session_id($current_session_id); 
session_name($current_session_name); 
session_start(); 
+0

Das hat für mich funktioniert! Es ist wichtig, auf die ursprüngliche Sitzung zurück zu wechseln, da ansonsten am Ende Code für die Handhabung der magischen Session ausgeführt wird und die Dinge merkwürdig werden! –

Verwandte Themen