Foros del Web » Programando para Internet » PHP »

Sesiones (y cookies)

Estas en el tema de Sesiones (y cookies) en el foro de PHP en Foros del Web. Hola, a ver si me pueden ayudar a mejorar la seguridad de mi red. Verán actualmente el inicio de sesión funciona de la siguiente manera ...
  #1 (permalink)  
Antiguo 11/12/2012, 11:07
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 12 años, 3 meses
Puntos: 7
Sesiones (y cookies)

Hola, a ver si me pueden ayudar a mejorar la seguridad de mi red.
Verán actualmente el inicio de sesión funciona de la siguiente manera
El usuario envía correo y pass por post, luego en mi script php la pass se encripta a sha1 y se compara con la de la base de datos. Si es correcto se inicia una sesión y se mete el id único del usuario en un $_SESSION[], este id es interno, el usuario mismo no lo sabe.
El caso es que quiero mejorar la seguridad de todo este proceso y quizás aprender a usar cookies, que session me está dando problemas, a veces se cierra sola tras 15 minutos, otras tras media hora.. es raro.
Para las contraseñas tengo pensado usar SHA-512 en un futuro y para la session tengo pensado generar un token aleatorio alfanúmerico que se almacene en la base de datos y se meta en un $_SESSION[]
De forma que tendríamos dos variables en session, el id unico del usuario y el token, el token se compararía con el de la base de datos del usuario de $_SESSION en cada ejecución del script para verificar que todo esté bien y que no se ha intentado ningún hackeo.
He leído que se pueden codificar las sessiones o algo de eso, no tengo ni idea de como funciona el tema, si alguien me lo pudiera explicar le estaría muy agradecido.
Respecto a las cookies no sé del todo como funcionan/usarlas y me da miedo usarlas por problemas de seguridad.
También tenía pensado encriptar la pass en la propia página de inicio con javascript antes de enviarla para evitar que lo vean sniffers pero me pareció tontería porque alguna persona malintencionada con sniffer podría perfectamente obtener el hash y envíarlo como si estuviera haciendo login sin que tenga que pasar por el codificador javascript, no sé si me explico. Corregidme si he dicho alguna tontería.
Espero que me puedan aclarar todo esto de la seguridad :P
  #2 (permalink)  
Antiguo 11/12/2012, 11:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Sesiones (y cookies)

Primero aprende bien lo que son las sesiones y como se propagan, ya que el mecanismo por defecto es una cookie justamente.

El cifrar una sesión de nada sirve, ya que estas están en el servidor y la única forma de que sean un problema de seguridad, es si alguien tiene acceso físico al servidor.

La cuestión de encriptar passwords es lo que tienes que verificar, puedes usar crypt() para hacer un hasheo del password, o usar otros métodos para encriptar realmente el password.

Saludos.
  #3 (permalink)  
Antiguo 11/12/2012, 11:36
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 12 años, 3 meses
Puntos: 7
Respuesta: Sesiones (y cookies)

Gracias por responder!

Las sesiones las entiendo bastante bien, no tengo problemas, o eso creo.

Lo de que las sesiones están en el servidor no es del todo exacto según lo que yo tengo entendido ya que el navegador del usuario almacena algo de información pero creo que esta información no es más que una especia de hash que el servidor le 'da' al navegador al iniciar sesión para identificarse. Por otro lado me ha parecido leer que existe algo llamado session hijacking pero imagino que sólo supone un problema de seguridad para el usuario en redes locales con un usuario usando sniffer en la misma red local.

Para encriptar contraseñas actualmente uso sha1(md5($contraseña)); desde los primeros días que empecé a aprender PHP por lo que las claves de mis usuarios están almacenadas de esa forma. Aún así imagino que podré cambiarlo por SHA-512, algo así como esto:
crypt('passdelusuario','$6$rounds=543210$randomsal tguardadaenbd$');
  #4 (permalink)  
Antiguo 11/12/2012, 11:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Sesiones (y cookies)

A eso me refiero, ese "algo le da" es una cookie, con el ID de sesión, no es un hash, es el identificador de sesión, y este se manda por cookies, o puede ser por la URL, pero el mecanismo por defecto es una cookie.

Session Hijacking es el "robar/impersonar" una sesión, lo que hacen es obtener justamente ese ID de sesión, y cuando visitan tu sitio pasan ese ID haciendose pasar por la persona que ya tenía el otro ID, de esa manera no necesitan logearse ni nada.

Lo que tienes que cuidar es el XSS, que es precisamente la manera de robar la cookie de sesión, también indicale a PHP que use HTTP Cookies, de esa manera no las pueden leer desde Javascript. Referencia: http://php.net/manual/en/function.se...kie-params.php

Es bueno que uses sha1(md5()), pero es mejor que uses salts, así puedes usar md5 solamente si quieres ej: md5($token . $password . $salt);

Saludos.
  #5 (permalink)  
Antiguo 11/12/2012, 12:01
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 12 años, 3 meses
Puntos: 7
Respuesta: Sesiones (y cookies)

Gracias! Lo del XSS tengo que mirarlo pero en teoría no debería de tener ningún problema, todo el contenido de los usuarios pasa antes por un htmlspecialchars() para quitar cualquier código aunque me imagino que como con todo, alguna forma habrá de 'hackearlo' digamos.

Luego si quiero hacer una cookie que se almacene en el navegador para inicio de sesión automático de forma segura cómo lo haría? Me refiero al método que buscar en el manual de php y google se hacerlo xD Lo que tengo en mente es generar un token alfanúmerico aleatorio largo que se almacene en la cookie y en una columna del usuario en la base de datos y que se compare pero me parece demasiado simple e inseguro.
  #6 (permalink)  
Antiguo 11/12/2012, 13:20
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sesiones (y cookies)

Hola yo te recomiendo cambiar el algoritmo por defecto utilizado para generar el id de session por defecto es MD5 yo te recomiendo whirlpool

ini_set('session.hash_function','whirlpool');

ademas como decias que tenias problemas con las sessiones que si se cierran solas etc...

ini_set('session.cache_limiter','nocache');
ini_set('session.cache_expire',180);
ini_set('session.cookie_lifetime',0);

para no propagar el id por url y

ini_set('session.use_trans_sid',0);
ini_set('session.use_cookies',1);
ini_set('session.use_only_cookies',1);

como te decia gatorv solo sera accesible la cookie desde http y no sera accesible para lenguajes de script

ini_set('session.cookie_secure',0);
ini_set('session.cookie_httponly',1);

la ruta donde guardamos las sessiones

ini_set('session.save_path','ruta directorio por ejemplo system/tmp/');

todavia quedarian algunas cosas mas pero creo que esto es lo mas importante


aparte del token tambien usaria la cabecera user agent y aparte de comprobar el token cada ejecucion del script generaria uno nuevo cada ejecucion al igual que el id de session ( session_regenerate_id() )


corrigeme si me equivoco en algo MAESTRO GatorV

saludos

Última edición por webankenovi; 11/12/2012 a las 13:31

Etiquetas: sesiones, variables, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:41.