2009-11-23 13 views
6

Tengo un objeto de usuario que contiene información sobre el usuario (nombre de usuario, IP, país, nombre, correo electrónico ... pero NO contraseña). ¿Debo guardar solo el nombre de usuario en la cookie y luego recuperar toda la información de DB al cargar la página, o simplemente almacenar todo el objeto User en la cookie?¿Es seguro almacenar el objeto del usuario en una cookie?

Respuesta

16

No puede confiar en la información almacenada en una cookie, ya que el usuario puede manipularla cuando lo desee.

Sugiero usar un PHP session para almacenar el objeto. De esta forma, el usuario final solo tiene una ID de sesión almacenada en una cookie, con los datos reales en su servidor.

Sin embargo, la sesión finalmente finalizará ... forzando al usuario a iniciar sesión de nuevo.

Editar: Vaya, debo señalar que las sesiones son realmente fáciles de usar. Simplemente haga lo siguiente:

session_start(); // This MUST be at the very top of every page that accesses the session 

// Store something in the session with the key 'something' 
$_SESSION['something'] = "Hi, I'm a session!"; 

// Retrieve 'something' from the session 
$myString = $_SESSION['something']; 
+7

+1 para 'no puede confiar en los datos de las cookies'. Para ampliar el punto de R. Bemrose, las cookies deben contener un puntero a los datos en su sistema, nada más. De esta manera, por sí solo, los datos de las cookies no tienen sentido. –

+0

Además, pasar grandes cantidades de datos en una cookie puede tener un efecto adverso en los tiempos de carga de la página a medida que la cookie se pasa con cada solicitud. – Yacoby

+0

O bien, podría tener un efecto positivo en los tiempos de carga de la página, ya que le permite eliminar una base de datos de ida y vuelta. Solo lo sabrás midiendo. :) – Thom

0

Para ese caso, yo diría que almacena la identificación de usuario en la cookie y eso es todo. Luego, al cargar la página por primera vez, carga todo lo que necesita de la base de datos y continúa usando una sesión, siempre y cuando el usuario permanezca en su página.

Para comprobar si la página se carga la primera vez, acabo de configurar un bool en la sesión si se ha cargado. Si el bool no existe, su usuario lo carga inicialmente.

Probablemente haya mejores formas de hacerlo, pero funciona bien y fácil. :)

1

La regla estándar de 'nunca confiar en los datos publicados' se aplica también a las cookies. Sugiero almacenar solo el ID de usuario, así como un hash de la ID y algunos secretos conocidos solo por el servidor.

0

¡Solo guarde una identificación de sesión! Datos nunca significativos como la identificación del usuario. Imagine que tiene un sitio con 10.000 usuarios. Lo más probable es que tengas al menos un usuario llamado superman y batman, si usas un nombre de usuario en una cookie para acceder a la información de tu sesión, es potencialmente posible manipular esa cookie para cambiar la información almacenada de mi nombre de usuario a batman y obtener acceso a la cuenta de Batman si su sesión todavía está viva. Si almacena algún tipo de identificación de sesión generada aleatoriamente, me resulta prácticamente imposible encontrar un número de sesión que funcione para otro usuario para secuestrar esa sesión.

0

Puede confiar en la información de la cookie si utiliza algo como Hmac. Los usuarios aún pueden ver los datos, pero sabría si lo han manipulado (por ejemplo, cambiar su nombre de usuario por el de otra persona para intentar ver los datos de otro usuario). Si no desea que vean los datos, también puede encriptar de manera simétrica los datos que está enviando. Obviamente, hay una sobrecarga de CPU en todo esto, y una sobrecarga de ancho de banda, más cosas que ingresas allí, pero es completamente legítimo hacer lo que estás pidiendo.

0

@ ApoY2k - Creo que el voto negativo (no era yo) se debió a que no puede suponer que el nombre de usuario que pasó de una cookie es el nombre de usuario real que escribió en la cookie. Es por eso que sugirieron usar el ID de sesión. Al usar el ID de sesión, puede obtener el nombre de usuario y, como dijo, solo es válido durante 20 minutos o lo que sea que configure el tiempo de espera de la sesión. SessionID no revela ningún dato privado. Tuve tu mismo pensamiento antes de encontrar esta publicación.

Cuestiones relacionadas