Manera correcta de hacer sesiones

Iniciado por lord_Sirikon, 26 Abril 2011, 14:30 PM

0 Miembros y 1 Visitante están viendo este tema.

lord_Sirikon

Hola a todos, lo primero: se que hay algunos posts pero ninguno me termina de resolver la duda, segundo: gracias de antemano.

Estoy haciendo una página web (un proyectillo) y quiero poner usuarios, iniciar sesión y todo eso, se que es con el session_start() y eso pero por muchos métodos que pienso, siempre averiguo una forma para explotar ese método.

Cuál es la forma más correcta de utilizar las sesiones?

Me tomo esto muy en serio ya que al fin y al cabo son las contraseñas de los usuarios lo que está en juego

Salu2!

Feedeex

Las sesiones hasta donde llegan mis conocimientos son casi imposibles de explotar. Y digo casi porque nunca se sabe todo.
Es más, ni siquiera teniendo una vulnerabilidad XSS en tu sitio web podrían robarlas, ya que trabaja del lado del servidor, y no como las cookies.

Kase

exacto..
de todos modos si estas paranoico no hace falta que guardes el password en la session =]

yo en session guardo datos que probablemente utilizare en todas las paginas, como el nombre de usuario que utilizo para ponerlo en el menu

$_SESSION_['USUARIO'] = $usuario
y para cuando necesito saber si el usiario esta logueado   e echo 2 cosas

if(isset($_session_[usuario]))   devolvera true si tienes algo guardado en esa variable o false..

mi segunda opcion es un
$_session_[login] = true
if ($_session_[login])


si aun estas paranoico podrias cifrar todo con crypt()
al guardar session ases un
$session_[cifrado] = crypt("esto esta cifrado")

y al checar sus valores no olvides hacer crypts

if ($session[cifrado] == crypt("esto esta cifrado"))

crypt es de una sola via, asi que no hay metodo de desencriptacion...


detodos modos todo esto es incesesario...

lo que si es necesario es que en tu bd encriptes los passwords y eso loases asi:

insert into usuario (usuario,pass) values ('pepito',sh1('perez'));
sh1 convertira perez en una cadena cifrada de 40 caracteres =P

el problema eske si tu usuario pierde el password nunca podras decirle cual es... tendras que decirle que cree otro xD

RedZer

pues lo ago igual que los demas defino que utilizare sessiones
session_start();
creo las sessiones con sus respectivos valores
$_session['user']=$"mi valor";
y para destruirlas
session_destroy();

aqui esta otro manual de como usarla
http://www.php.net/session_register
Nacido y criado entre gente que enseño a pensar antes de creer a ciegas, Todo me causa curiosidad en el mundo

~ Yoya ~

Cita de: Feedeex en 26 Abril 2011, 18:55 PM
Las sesiones hasta donde llegan mis conocimientos son casi imposibles de explotar. Y digo casi porque nunca se sabe todo.
Es más, ni siquiera teniendo una vulnerabilidad XSS en tu sitio web podrían robarlas, ya que trabaja del lado del servidor, y no como las cookies.

Te equivocas, la sesiones no trabajan del lado del servidor, solamente es un archivo que se almacena en el servidor que contiene la información y su nombre corresponde a la id.

Si te puedes fijar, al crear una sesión, se crea una cookie con el nombre PHPSESSID (Por defecto) que contiene la ID del archivo de sesión que esta alojado en el servidor. Si puedes obtener la Cookie PHPSESSID que tiene como valor la ID de sesión, puedes sacar provecho... Aveces la ID de sesion puede ir via COOKIE pero de igual manera via GET.

Session Hijacking
CSS History Hack In Firefox


Cita de: Kase en 26 Abril 2011, 19:14 PM
if(isset($_session_[usuario]))   devolvera true si tienes algo guardado en esa variable o false..

Error, devuelve true si la sesion esta definida.



Las ID de sesiones genera PHP+Apache  casi imposible de adivinar, asi que por un lado son un poco mas segura, si sabes una forma de explotarlo puedes plantearla porque quizás te estés equivocando o la forma de explotarla como dices es por medio de otra vulnerabilidad.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

RedZer

Nacido y criado entre gente que enseño a pensar antes de creer a ciegas, Todo me causa curiosidad en el mundo

Feedeex

@~ Yoya ~: ¿Y de que serviría obtener la ID de la sesión?. Si de todos modos es aleatoria y al destruirla muere.

~ Yoya ~

Puedes usarla para ver el contenido del archivo que tiene por nombre el ID de sesión, pero seria necesario tener acceso al servidor y es muy poco probable.

Ejemplo:
Código (php) [Seleccionar]
<?php
session_start
();

$_SESSION['hola'] = 'asa';
?>



root@yoya:~# cat /var/lib/php5/sess_io8q0sh042ovjq6ssiicsg63n3
hola|s:3:"asa";




La otra opción, es la mas explotada. Seria sustituir tu ID de sesión por la que haz obtenido. Osea, si una web utiliza Sesiones para verificar que estas conectado y saber que rango tienes como puede ser admin, si logras obtener la ID de sesión esa persona estaria conectado/logueado como el rango que tiene, en este caso seria admin.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Feedeex


Spider-Net

#9
Yo cuando uso sesiones o cookies lo que hago es comprobar que los datos son correctos en la base de datos antes de proceder.

Por ejemplo, cuando un usuario se identifica puedo crear una cookie o unas variables de sesion con el id del usuario y la contraseña cifrada en MD5 o SHA1, luego en cualquier parte del código que quiero mostrar sólo a usuarios logeados hago lo siguiente:

Código (php) [Seleccionar]
// primero compruebo que no están vacíos
if(!empty($_SESSION['user']) && !empty($_SESSION['password']){
     //conecto a la base de datos
     $link=conectar();
     $query=mysql_query("SELECT * FROM usuarios WHERE user='".mysql_real_escape_string($_SESSION['user'])."' AND password='".mysql_real_escape_string($_SESSION['password'])."'");
     if(mysql_num_rows($query)>0){
          // Si encuentra resultados quiere decir que el usuario tiene la información correcta en las variables de sesion
          // AQUÍ YA ES SEGURO REALIZAR LAS OPERACIONES YA QUE EL USUARIO ES IDENTIFICADO CORRECTAMENTE
     }
}


Yo creo que hacer esto es imprescindible porque las variables de sesión y las cookies pueden ser modificadas por el usuario, por lo tanto si directamente usamos la información que hay en las cookies es fácil que nos provoquen una inyección sql o que manipulen el usuario y obtengan información sin realmente estar logeados. Por lo tanto creo que es lo más seguro, comprobar siempre que la información de sesión o de cookies se corresponde con la información de la base de datos antes de mostrar o procesar información de los usuarios.