2010-04-11 30 views
7

Mientras estaba leyendo sobre secuestro de artículos de sesión, aprendí que sería bueno encriptar el valor de identificación de sesión que está almacenado en una cookie.¿Cómo encriptar la identificación de la sesión en una cookie?

Por lo que sé, cuando comienzo una sesión llamando al session_start(), PHP no cifra el valor de identificación de sesión en una cookie.

¿Cómo cifro el valor de identificación de sesión y luego inicializo la sesión con él?

+0

¿Puede alguien eliminar la etiqueta 'session-encrypt'? –

+0

@smotchkiss // Estaba pensando en eso también. Perdón por el nombre impreciso de la etiqueta. – Moon

+0

Sé que esto no responde su pregunta por decir. Pero, ¿ha considerado almacenar el IP junto con el ID de sesión y verificar el IP al leer la sesión? De esta forma, puede estar razonablemente seguro de que la computadora que proporciona la identificación de la sesión es la misma a la que emitió la sesión. – Voltin

Respuesta

18

El cifrado no ayudará. La cookie de sesión es solo un número mágico de todos modos. Cifrarlo solo significa que hay un número mágico diferente para secuestrar. Dependiendo de los escenarios de secuestro que tenga en mente, existen otras posibles mitigaciones. Por ejemplo, puede limitar sesiones a una sola IP. Eso plantea algunos problemas, por ejemplo, personas que cambian entre puntos inalámbricos.

+0

Solo para (con suerte) aclarar para el OP: la * sesión * en la que se transfiere la cookie aún debe cifrarse, y la bandera de cookies HTTPOnly debe establecerse para evitar su transferencia a través de canales no cifrados. La correcta encriptación del canal de comunicación sobre el que se transporta la cookie de sesión hace que sea más difícil para un atacante interceptar la cookie. – atk

+0

La pregunta era sobre encriptar la coookie misma, es decir, el valor almacenado por el navegador. Estoy de acuerdo en encriptar el tráfico que vale la pena para ciertas aplicaciones. Creo que te refieres a la bandera segura, no solo a HTTPOnly. –

+0

Gracias. Esta respuesta ayudó a entender el dominio del problema. Ahora tengo una solución en https y donde la identificación de sesión se reemplaza para cada solicitud. – nalply

3

Suponiendo que su cookie de sesión es un GUID, no tiene sentido encriptarlo. Simplemente reemplazaría una cadena pseudoaleatoria por otra.

1

Desafortunadamente, cifrar la ID de la sesión no aumentará mucho la seguridad, ya que el atacante solo puede usar la forma encriptada (que de todas maneras es la única visible para ellos).

Lo único que esto podría evitar es el truco con el que envía a alguien un enlace? PHPSESSID = foo en él, lo que hará que PHP cree esa sesión. Puede evitar eso mediante el uso de cifrado y validación, pero debería desactivar completamente la transferencia de ID de sesión en la URL.

+0

Creo que mantener session.use_trans_sid (http://www.php.net/manual/en/session.configuration.php#ini.session.use-trans-sid) deshabilitado es suficiente para evitar esto. –

+0

Sí, lo es. Afortunadamente está deshabilitado por defecto. –

5

Es más importante que sus ID de sesión sean aleatorias (es decir, alguien no puede usar su ID de sesión para adivinar la de otra persona), ya que el peligro real es que alguien tenga la ID de sesión de otro usuario. Siempre que los mantenga verdaderamente aleatorios, no hay razón ni utilidad para encriptarlo

1

Realice este script, acceda desde un navegador web y luego verifique sus cookies.

<?php 
    session_start(); 
?> 

es probable que vea algo como esto

Site   Cookie  Value 
mysite.com PHPSESSID 6fktilab3hldc5277r94qh2204 

PHP hace un trabajo muy bien si la generación de un agradable, identificación única. No tiene sentido encriptar esto.

+0

Esto no responde a la pregunta del cartel en absoluto? – zombat

+0

@zombat, estaba demostrando que PHP no genera un 'PHPSESSID' de' 5' o algo completamente débil como el OP pudo haber estado pensando. –

1

Siempre es una buena idea que nunca dependa únicamente de una cookie o artículo para validar su (s) usuario (s) conectado (s). Como se mencionó anteriormente, es una buena idea almacenar también el IP y verificarlo. Una buena adición sería almacenar el USER_AGENT.

Ten en cuenta que si tu aplicación es de código abierto, eres igual de bueno con solo una identificación de sesión porque el pirata informático podría identificar fácilmente qué es lo que estás validando.

0

La identificación de la sesión es relativamente difícil de entender, por lo que ese no es realmente el problema.

Hay cosas que puede hacer relacionados con el presente para contrarrestar los ataques:

  • crear una nueva sesión cuando un usuario inicia sesión
  • límite de la duración de una sesión

Hay algunas otras cosas también.Siempre recomiendo estudiar el Rails Guide en estos temas, ofrece una explicación muy accesible de problemas conocidos y contramedidas, todos igualmente aplicables al código PHP.

0

Tiene sentido encriptar datos de cookies cuando usa cookies para almacenar información confidencial. que solo el servidor debería leer (descifrar).

No hay ninguna razón para cifrar la identificación de la sesión, ya que el pirata informático puede usar esa identificación de sesión cifrada para suplantar a su víctima.

Cuestiones relacionadas