2010-05-10 17 views
6

estoy trabajando con sesiones en PHP, y tengo diferentes aplicaciones en un solo dominio. El problema es que las cookies son específicas de un dominio y, por lo tanto, las ID de sesión se envían a cualquier página en un solo dominio. (No sé si hay una manera de hacer que las cookies funcionen de manera diferente). Entonces, las variables de sesión son visibles en todas las páginas de este dominio. Estoy tratando de implementar un gestor de sesión personalizado para superar este comportamiento, pero no estoy seguro si lo estoy pensando bien.cómo implementar el manejo de sesión mejorado en PHP

Quiero evitar por completo el sistema de sesión PHP, y hacer un objeto global, que almacenaría los datos de la sesión y al final del script guárdelo en la base de datos.

  1. En el primer acceso me gustaría generar session_id único y crear una cookie
  2. En el extremo de la secuencia de comandos o guardar datos de sesión con session_id, marcas de tiempo para inicio de sesión y último acceso, y los datos de $ _SERVER, como REMOTE_ADDR , REMOTE_PORT, HTTP_USER_AGENT.
  3. En cada base de datos de chceck de acceso para session_id enviada desde el cliente, compruebe IP, puerto y agente de usuario (por seguridad) y lea los datos en la variable de sesión (si no caduca).
  4. Si session_id expiró, elimínelo de la base de datos.

Esa variable de sesión se implementaría como singleton (sé que conseguiría un acoplamiento estrecho con esta clase, pero no sé si hay una mejor solución).

Estoy tratando de obtener beneficios siguientes: Variables

  • Sesión invisibles en otras secuencias de comandos en el mismo servidor y mismo dominio
  • gestión
  • encargo de la caducidad de sesión
  • manera de ver las sesiones abiertas (algo como lista de usuarios en línea)

No estoy seguro de si estoy pasando por alto cualquier desventaja de esta solución. ¿Hay alguna forma mejor?

Gracias!

ACTUALIZACIÓN: i no explicaba en detalle suficiente y causó mucha confusión en este punto, por lo que quiero hacer más claro lo que estoy trabajando con: la

estoy construyendo aplicación de servidor SOA, que se desplegaría en muchos entornos diferentes. No tendrá su propio servidor web, por lo que en esos entornos podría haber otras aplicaciones PHP. Los empleados de estas compañías tendrán cuentas de usuario en esta aplicación, por lo que obtendrán una cookie con ID de sesión en esta aplicación.

Como sabemos, el servidor web que ejecuta PHP al cargar los datos de la sesión no hace diferencia (al menos por defecto) qué secuencia de comandos desde qué directorio creó la sesión. Todo lo que necesita es una ID de sesión. Esta ID de sesión se envía con cada solicitud de cliente a servidor. De sus respuestas obtuve una forma, ¿cómo podría PHP restringir las cookies para cierto directorio, pero el usuario malintencionado puede editar las cookies, ya que se almacenan en su computadora. El usuario malintencionado en mi caso puede tener acceso para escribir y ejecutar el script php en el mismo entorno, aunque no tenga acceso a mi aplicación y a su base de datos. Si crea una secuencia de comandos, podría usar Identificación de sesión desde la cookie de mi aplicación, por lo que tiene acceso para leer y editar datos de sesión en mi aplicación y obtener acceso a partes de mi aplicación, que no debería permitírsele.

Veo que habrá otras amenazas de seguridad en la implementación de la aplicación en dicho entorno, lo que busco es el mejor aislamiento que pueda hacer, y el manejo de sesiones predeterminado parece demasiado peligroso y no está diseñado para usos como este.

Así que mi pregunta es, si usted ve algo, que es menos seguro, menos flexible en mi diseño, de lo que sería con la gestión de sesión predeterminada ..

Gracias por sus respuestas, ..

+0

Bloqueo de la dirección IP y el puerto no es una buena idea. Porque, en general, ambos pueden cambiar de una solicitud a otra. – Gumbo

+0

No sé sobre port, pero leí en algún tipo de libro de seguridad de PHP, que no debe permitir solicitudes de IP diferentes, porque es un tipo común de ataque para robar Session Id y la restricción de IP debe evitar el uso de este robo carné de identidad. Entiendo que podría haber algunas situaciones en las que su ip está siendo modificada, pero ¿sabe qué tipo de situaciones son esas? – marianboda

+0

Algunos ISP asignan a las personas una nueva IP cada solicitud. – pinkgothic

Respuesta

1

Eche un vistazo al método session_set_save_handler en PHP.

http://php.net/manual/en/function.session-set-save-handler.php

Bueno, para ser objetivamente correcta, varias empresas utilizan el enfoque de tener manejadores de sesión personalizados para múltiples dominios, distribuidos en memoria/base de datos de respaldo manejo

+0

Sí, lo hice, y no creo que esto resuelva mi problema principal con la visibilidad de las variables de sesión en todo el dominio. – marianboda

0

quiero evitar por completo la sesión Sistema de sesión PHP, y crear un objeto global, que almacenaría los datos de la sesión y al final del script, guárdelo en la base de datos.

Si usted está pensando en la serialización de los objetos, ya no quiero recomiendo ya que no es una buena práctica para mantener datos seguros.

http://www.php.net/manual/en/function.session-set-save-handler.php#81761

Tenga una mirada en el ejemplo anterior, se ha dado una buena solución.

Mantenimiento de su estado en los dominios.

  1. Primero se genera un identificador único.
  2. Puede crear una cookie que se lea en cada acceso de página. En cada página, el cookie se envía desde el navegador al servidor.
  3. También puede pasar su identificador único como parte de cada URL que genera, si desea otro enfoque en lugar de cookie.

Actualización:

  1. Primero debe restringir a los usuarios a su aplicación según la dirección IP, si desea hacerlo más seguro que se puede achived través de la restricción de los usuarios crossdomain.xml.

  2. que hay que buscar en el cifrado de su sesión de modo que incluso si el usuario lo divide no podía usarlo. Los datos se deben cifrar con claves privadas y descifrar usando uno público. El apretón de manos se basa en claves públicas.

+0

No entiendo cómo quiere decir "no mantener los detalles de seguridad". No almacenaría la contraseña del usuario, ya que no serviría para nada, pero todos los demás datos confidenciales, además de una aplicación creada, ya están en la base de datos, por lo que no creo que sean menos seguros. . Lo que quiero almacenar son solo datos de sesión: qué usuario está conectado y algunas configuraciones de sesión. Tal vez debería haber mencionado que sería un servidor SOA. – marianboda

+0

Si está almacenando su información de sesión y reconectando en cada acceso, puede sobrecargar su base de datos y también sus datos deben limpiarse periódicamente. – Thalaivar

+0

La conexión debe abrirse entre las solicitudes y solo las consultas enviadas en cada acceso. Las sesiones de PHP funcionan por defecto con los archivos, pero alternativamente se puede cambiar a la base de datos.en ese caso, es lo mismo, como el manejo de la sesión de db incorporada, y en el caso de los archivos, creo que es sobrecarga para el servidor web. Hasta donde yo sé, las bases de datos están mejor optimizadas para este tipo de acceso a datos. Además, ambas formas deben ser limpiadas periódicamente. ¿Hay alguna forma en que esto podría evitarse? – marianboda

2

Es necesario utilizar:

session_set_cookie_params()

http://www.php.net/manual/en/function.session-set-cookie-params.php

En particular, es necesario establecer el "camino" en cada una de sus aplicaciones web.

+0

sí, pasé por alto éste :) gracias, .. pero cuando lo pienso ahora, desde el punto de vista de la seguridad, si envía la cookie (modificado para que funcione en otros directorios) a otra aplicación en ese servidor, que la aplicación accederá a los datos de esa sesión. – marianboda

+0

Cada aplicación dará diferentes session_id's. Entonces no pueden acceder a los datos de los demás. es posible que tenga algunos viejos datos de la sesión utilizando el valor por defecto "/" camino sin embargo, por lo que necesita para borrar las cookies de su navegador una vez que la solución está en el lugar para todas las aplicaciones. – Foo

+0

Asegúrese de que usted lo llama * antes * session_start() – Foo

0

No estoy seguro de si estoy pasando por alto cualquier desventaja de esta solución. ¿Hay alguna forma mejor?

es muy complicado, y no va a funcionar, p. remote_port cambiará entre las solicitudes, remote_addr puede cambiar.

Hay al menos 2 soluciones obvias sin reinventar los trabajos de gestión de sesión manera:

1) utilizar un nombre de cookie distinta para la sesión en cada aplicación - ver session_name()

2) tienen cada aplicación en una subdirectorio diferente (por ejemplo http://example.com/app1/, http://example.com/app2/, ...) y establecer la ruta de la cookie - ver session_set_cookie_params o utilizar diverso ajuste ini para session.cookie_path

+0

Bueno, verificar la dirección IP y el puerto no es una característica esencial, por lo que no va a ser un punto de falla de mi diseño. Puedo usarlo para analizar posibles ataques, puedo restringir a los usuarios seleccionados para que usen solo cierto rango de direcciones IP, puedo usar esta información como yo quiera, y es posible que no la use en absoluto. Y sus soluciones funcionarían para esas galletas, pero yo no quiero variables de sesión sean visibles en otra aplicación, incluso si secuestrar cookie de app1 y enviarlo a app2. Tal vez no sería difícil superar esto, pero no me daría otras ventajas como una mejor expiración mngmt. – marianboda

+0

El método 1 expondría los identificadores de sesión en la aplicación. El método 2 no. La forma en que expira los datos de la sesión es independiente de cómo concilia al usuario con la sesión: ¿qué propones para la expiración de la sesión que sea de alguna manera mejor que el método predeterminado? (No veo ninguna diferencia excepto por el mayor riesgo de mantener tu propio código para esto). – symcbean

+0

No dije que expondría la identificación de la sesión. Traté de explicar un escenario de un ataque en la actualización de mi pregunta. Expiración de la sesión: ya tengo un requisito para que las sesiones de ciertos usuarios caduquen después de muy poco tiempo. Tiene que ser flexible, por lo que la conexión del rango de IP de la corporación no debería expirar tan rápido como las conexiones desde el exterior. Se puede hacer que no caduque en ciertas direcciones IP para ciertos usuarios. No cuestionemos el aspecto de seguridad de hacerlo, pero en general, podría ser muy útil tener tal flexibilidad – marianboda

1

Si no quiere tener problemas con sesiones compartidas, puede utilizar el session_save_path función para establecer una ruta donde su aplicación guardará sus archivos de sesión. Como no será el utilizado por otras aplicaciones en el servidor, no se encontrará con problemas para compartir sesiones.

Solo una cosa: asegúrese de que la ruta en la que guarda sus archivos de sesión no sea accesible desde la web. Algo así como:

/YourAppFolder 
    /www (web accessible) 
    /libs 
    /config 
    /session (where you put your session files) 
1

Esto es lo que se puede mirar en:

  • Establecer ruta de acceso y dominio de la sesión de identificación. Si el dominio es .mastergaurav.com, las cookies se enviarán de regreso a mastergaurav.com, www.mastergaurav.com, blogs.mastergaurav.com etc.
  • Puede ser, en lugar de usar ID de sesión como cookie, si tiene que realmente atravesar múltiples dominios TLD -, lo convierten en una parte de la dirección URL de la aplicación completamente personalizado:
    abcd.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>&domain=<your-domain>
+0

No creo que haya tenido mi problema. No trato con múltiples dominios/subdominios, y aunque lo fuera, creo que no resolvería ninguno de mis subproblemas – marianboda

Cuestiones relacionadas