2009-08-28 19 views
9

Eseguo foo.com. Ho due diverse applicazioni che vivono in foo.com: una è foo.com/bar, e l'altra è foo.com/example. Uso le sessioni per tenere traccia delle informazioni sull'utente mentre sono loggate, ma se l'utente va da foo.com/bar a foo.com/example, foo.com/example vede la sessione avviata dall'utente da foo.com/ barra e utilizza tali informazioni. La mia domanda è, come posso avere due sessioni diverse per ogni directory allo stesso tempo?Avere due sessioni diverse nello stesso dominio

+0

Cosa fare se vogliamo ottenere la stessa funzionalità nel progetto django powered? – Dania

risposta

2

È anche possibile utilizzare la stessa sessione ma modificare i nomi delle variabili che si cercano.

Modifica: Siamo spiacenti, questo non risponde alla tua domanda, ma offre una soluzione alternativa.

+0

Questa sembra essere la soluzione migliore. Grazie. – Matthew

+0

Grazie Matthew: Ricorda che se risponde alla tua domanda, ricorda di contrassegnarla come 'La risposta' :) – user103219

+0

La risposta più votata è migliore - il modo migliore è usare 'session_name'. – joryl

1

Potrebbe essere possibile utilizzare session_set_cookie_params per impostare il dominio e la cartella per la sessione da salvare in. IE:

// Used on foo.com/example 
session_set_cookie_params(86400, '/example'); 

// Used on foo.com/bar 
session_set_cookie_params(86400, '/bar'); 
+0

Questo non sembra funzionare; L'ho provato prima (e solo ora di nuovo) senza successo. Potrebbe avere a che fare con le mie impostazioni php.ini globali. – Matthew

+0

È necessario per aggiungere la barra retroversa finale al percorso. Senza di esso non funzionerà sicuramente. –

+0

Se si ha accesso al file php.ini, si può provare a impostare direttamente il parametro 'session.cookie_path', poiché è ciò che questa funzione deve sovrascrivere. Puoi anche usare ini_set() se non hai accesso al file php.ini. –

0

Un'altra soluzione è creare in modo efficace uno spazio dei nomi all'interno della sessione anticipando tutti i valori di sessione da foo.com/bar con "bar_" e foo.com/example con "example_".

Il modo in cui è possibile evitare che questo sia noioso è di astrarre questa funzionalità in un metodo di funzione o di classe. Ad esempio:

function set_session_value($key, $value) { 

    //figure out which prefix to use by checking the current working 
    //directory, or whatever method you like. set $prefix equal to 
    // "bar_" or "example_". 

    $_SESSION[$prefix . $key] = $value; 
} 

Quindi ottenere i valori con una funzione corrispondente.

Il vantaggio principale di questo è che non è necessario pensare a quali nomi di variabili si stanno utilizzando in/example durante la programmazione in/bar. L'altro è che se si decide di cambiare il modo in cui si memorizzano i valori di sessione, è possibile modificare facilmente tutto in un unico punto.

41

È necessario chiamare session_name prima di chiamare session_start. Questo imposta il nome del cookie utilizzato per identificare la sessione (per impostazione predefinita questo è PHPSESSID).

Utilizzare un nome diverso per ciascuna applicazione. Non dovresti avere problemi con le variabili all'interno della sessione.

+6

+1: questo è davvero il modo migliore per tenere separate le sessioni delle applicazioni. – Powerlord

+1

La migliore soluzione per tenerli separati. Dare +1 – eHussain

0

Mi rendo conto che questo è vecchio, ma pensato che potrebbe aiutare qualcuno. Questo esempio mostra come stiamo impostando una sessione separata per la nostra area di amministrazione.

if ($_SERVER['REQUEST_URI'] == '/admin/'): 
    $session_name = 'session1'; 
else: 
    $session_name = 'session2'; 
endif; 
session_start($session_name); 
4

Penso sia molto importante evidenziare le potenziali implicazioni di sicurezza associate alle soluzioni fornite finora. Sono stato un tester di penetrazione di applicazioni Web per circa 5 anni e ho sviluppato numerose applicazioni di sicurezza vulnerabili in questo periodo per aiutare con la formazione di junior che iniziano nella sicurezza IT.

Ho appena testato le soluzioni fornite e ho notato che nessuno di loro impedisce l'accesso a una sessione appartenente all'app vicina. L'uso di nomi di identificativi di sessione diversi con session_name() non impedisce agli utenti di utilizzare il valore di questi identificatori. PHP non ha una memoria segregata per ogni nome identificativo di sessione. Avevo due app che utilizzavano nomi di sessione diversi e impostando un percorso cookie per il browser. I seguenti rispettive direttive Set-Cookie sono stati inclusi in risposte HTTP:

Set-Cookie: TESTONE=<value one>; path=/testone/ 

Set-Cookie: TESTTWO=<value two>; path=/testtwo/ 

Se entrambe le applicazioni avuto utenti completamente separate e qualcuno aveva solo accesso al /testtwo/ applicazione, possono essere in grado di accedere a informazioni su App /testone/ seconda il modo in cui venivano gestiti i parametri di sessione.Un segmento di codice di esempio riportato di seguito mostra una potenziale violazione dei dati presupponendo che entrambe le app utilizzino un parametro $_SESSION["authenticated"] dopo l'autenticazione corretta.

<?php 
    session_name("TESTONE"); 
    ini_set("session.cookie_path","/testone/"); 
    session_start(); 
    if ($_SESSION["authenticated"] == "yes") 
     echo $topsecretinfo; 
?> 

Per accedere a questa $topsecretinfo avrebbe solo bisogno di autenticare l'applicazione /testtwo/, prendere il valore del loro identificatore TESTTWO sessione e usarlo come il valore dell'identificatore TESTONE sessione quando l'invio di richieste all'applicazione /testone/. Il processo di ricerca della sessione di PHP non riconosce il nome dell'identificatore di sessione tranne per l'analisi del valore di correspoding. Ad esempio, un valore identificatore di sessione di "agcy648dja6syd8f93" restituirà lo stesso oggetto sessione indipendentemente dal nome usato per riferirsi ad esso.

Problemi correlati