2009-08-28 17 views
9

Ejecuto foo.com. Tengo dos aplicaciones diferentes que viven en foo.com: una es foo.com/bar, y la otra es foo.com/example. Utilizo sesiones para rastrear información sobre el usuario mientras están conectados, pero si el usuario va de foo.com/bar a foo.com/example, foo.com/example ve la sesión que el usuario inició desde foo.com/ barra y usa esa información. Mi pregunta es, ¿cómo puedo tener dos sesiones diferentes para cada directorio al mismo tiempo?Tener dos sesiones diferentes en el mismo dominio

+0

¿Qué hacer si queremos lograr la misma funcionalidad en el proyecto django powered? – Dania

Respuesta

2

También podría usar la misma sesión pero cambiar los nombres de las variables que busca.

Editar: Lo siento, esto no responde a su pregunta, pero le da una solución alternativa.

+0

Esta parece ser la mejor solución. Gracias. – Matthew

+0

Gracias Matthew: Recuerda que si responde a tu pregunta, recuerda marcarla como "La respuesta" :) – user103219

+0

La respuesta más votadas es mejor: la mejor manera es usar 'session_name'. – joryl

1

Puede usar session_set_cookie_params para configurar el dominio y la carpeta para la sesión que se guardará en. IE:

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

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

Esto no parece funcionar; Lo he intentado antes (y ahora de nuevo) sin éxito. Podría tener que ver con mi configuración global php.ini. – Matthew

+0

Necesita para agregar una barra diagonal inversa a la ruta. Sin eso, ciertamente no funcionará. –

+0

Si tiene acceso a php.ini, puede intentar configurar directamente el parámetro 'session.cookie_path', ya que se supone que esta función debe anularse. También puede usar ini_set() si no tiene acceso al archivo php.ini. –

0

Otra solución es crear de manera efectiva un espacio de nombres dentro de su sesión pre-pendiente de todos los valores de sesión de foo.com/bar con "bar_" y foo.com/example con "ejemplo_".

La forma en que puede evitar que esto sea tedioso es resumir esta funcionalidad en una función o método de clase. Por ejemplo:

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; 
} 

Luego obtenga sus valores con una función correspondiente.

La principal ventaja de esto es que no tiene que pensar en qué nombres de variables está utilizando en/example mientras programa en/bar. La otra es que si decide cambiar la forma en que está almacenando los valores de la sesión, puede cambiar fácilmente todo en un solo lugar.

41

Debe llamar al session_name antes de llamar a session_start. Esto establece el nombre de la cookie utilizada para identificar la sesión (por defecto es PHPSESSID).

Use un nombre diferente para cada aplicación. No debería tener que meterse con las variables dentro de la sesión.

+6

+1: Esta es realmente la mejor manera de mantener las sesiones de aplicaciones separadas. – Powerlord

+1

La mejor solución para mantenerlos separados. Dando +1 – eHussain

0

Me doy cuenta de que esto es viejo, pero pensé que podría ayudar a alguien. Este ejemplo muestra cómo estamos configurando una sesión separada para nuestra área de administración.

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

Creo que es muy importante resaltar las posibles implicaciones de seguridad asociadas con las soluciones proporcionadas hasta ahora. He sido un probador de penetración de aplicaciones web durante aproximadamente 5 años y he desarrollado numerosas aplicaciones de seguridad vulnerables en este momento para ayudar con la capacitación de principiantes en seguridad informática.

Acabo de probar las soluciones proporcionadas y he observado que ninguna de ellas impide el acceso a una sesión perteneciente a la aplicación vecina. El uso de diferentes nombres de identificador de sesión con session_name() no impide que los usuarios usen el valor de estos identificadores. PHP no tiene un almacenamiento segregado para cada nombre de identificador de sesión. Tenía dos aplicaciones con diferentes nombres de sesión y estableciendo una ruta de cookies para el navegador. Las siguientes directivas Set-Cookie respectivos fueron incluidos en las respuestas HTTP:

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

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

Si ambas aplicaciones tenido los usuarios totalmente independientes y alguien sólo tuvo acceso a la aplicación /testtwo/, es posible que puedan acceder a la información sobre la aplicación /testone/ dependiendo la forma en que se manejaban los parámetros de sesión.Un segmento de código de ejemplo a continuación muestra una posible violación de datos suponiendo que ambas aplicaciones usan un parámetro $_SESSION["authenticated"] después de una autenticación exitosa.

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

Para acceder a este $topsecretinfo uno solo necesitaría para autenticar la aplicación /testtwo/, tomar el valor de su identificador de sesión de TESTTWO y utilizarlo como el valor del identificador de sesión de TESTONE al enviar peticiones a la aplicación /testone/. El proceso de búsqueda de sesión de PHP no reconoce el nombre del identificador de sesión excepto para analizar el valor correspondiente. es decir, un valor de identificador de sesión de "agcy648dja6syd8f93" devolverá el mismo objeto de sesión independientemente del nombre utilizado para referirse a él.

Cuestiones relacionadas