Foros del Web » Programando para Internet » PHP »

Sesiones cookies seguridad y cefalea

Estas en el tema de Sesiones cookies seguridad y cefalea en el foro de PHP en Foros del Web. Estuve buscando bastante sobre el tema de las sesiones, y me encontré con un dilema que creo ya es un clásico. Usamos o no Cookies ...
  #1 (permalink)  
Antiguo 10/10/2010, 12:29
 
Fecha de Ingreso: mayo-2005
Mensajes: 284
Antigüedad: 18 años, 10 meses
Puntos: 11
Sesiones cookies seguridad y cefalea

Estuve buscando bastante sobre el tema de las sesiones, y me encontré con un dilema que creo ya es un clásico.

Usamos o no Cookies con las sesiones?

En PHP creo que podemos habilitar las dos opciones asi:
Código PHP:
Ver original
  1. ini_set("session.use_cookies",1);
  2.      ini_set("session.use_only_cookies",0);
  3.      ini_set("session.use_trans_sid",1);
  4.      session_start();

Lo que hace PHP es agregar la constante/variable SID a todos los tags definidos en:
url_rewriter.tags

Esta SID tiene una cadena vacía si existe una cookie con el ID de la sesion y sino existe la cookie vale esto: 'session_name() . ' =' . session_id()'

Ahora, que es lo mejor? usar solo la cookie para el ID, usar solo las URLs, o usar las dos?


Cuales son los problemas de seguridad que pueden tener ambas opciones?

A mi se me ocurren estos:
Sessiones en las URLS:
  • Permiten que haya un hijacking de la session incluye sin intencion
    por ej. si el usuario guarda en favoritos la pagina con la session en la URL
    si queda en el navegador en el historial la URL con la session
    si el usuario le envia el link a otro usuario para que entre y tiene la session en la URL
  • Problema con los buscadores, ya que verian como distintas versiones de la misma pag. segun el sessionID (supongo Google tiene la inteligencia para evitar esto pero no estoy seguro)
  • Problema con las URLs amigables, como lo implementamos aca?
  • Los header Location y los links generados con JS no incluyen el SID asique hay que agregarlo a mano
  • Si tenemos links a sitios externos, PHP les agrega tambien el SID a estos?
    corrijo esto, solo a los links RELATIVOS se les agrega el SID justamente para evitar esto. Pero como contra entonces esta que tenemos que agregar manualmente el SID a los links absolutos de nuestro propio sitio, si existen

SessionID guardado en Cookies:
  • Si no tienen cookies habilitadas no funcionan
  • Si no tienen cookies habilitadas ademas se genera una nueva session por cada pag que visitan sobrecargando al servidor

No se me ocurren otras, alguien puede extender la lista?

De todas formas supongo manejarse con cookies siempre es mejor, pero que pasa si no tienen cookies? (los telefonos moviles por ej. manejan cookies?)
Porque la alternativa de las URLs parece muy insegura y peligrosa.

Que recomiendan ustedes?

De paso aprovecho a dejar un compilado de pequeños scripts para mejorar la seguridad de las sesiones que encontré:

Cita:
session_start();
if(!isset($_SESSION['create'])){
session_regenerate_id();
$_SESSION['create'] = TRUE;
}
Esto puede servir por ej. si desde un sitio externo ponen un link a nuestro sitio con: ?PHPSESSID=xxxxx
Entonces en nuestro sitio al usar session_start() PHP va a usar ese SessionID que creo el otro sitio (o sea que el sitio externo conoce el sessionID y tiene acceso a toda la información del usuario)
Entonces este codigo es una forma de evitar que alguien pase una session a la URL si no fue creada ninguna session todavia.
Aunque hay muchos que experimentan problemas con session_regenerate_id, a veces no regenera a veces si se carga rapido la pagina dos veces se pierde la sesion, etc, no me queda muy claro :(


Cita:
session_start();
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
else{
if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']){
Echo "I'm sorry but this is a possbile security violation, please try logging in again";
}
}
El codigo de arriba lo que hace es guardar el user_agent en la session y lo chequea siempre, para evitar que se use la session desde otro navegador.
Podriamos combinarlo tambien con la IP, => IP+UserAgent para tener un valor mas único.



Cita:
$seconds = 1440;
// or ini_get('session.gc_maxlifetime');
if (isset($_SESSION['last_access']) && $_SESSION['last_access'] < (time() - $seconds)) {
// expired, do something about it
}
// update last access time
$_SESSION['last_access'] = time();
Con el codigo de arriba le damos un tiempo máx. de inactividad a la session, asi no pueden reutilizarla despues de ese tiempo.

Cita:
ini_set('session.referer_check', 'tusitio.com'); //esto va antes de session_start();
Chequea el referer para evitar hijackings accidentales:
Por ej. si el link a nuestro sitio esta en otro sitio (va a enviar un referer incorrecto) o si le pasamos el link a alguien, que lo pega en el navegador, no va a enviar referers asique tampoco va a usar la session.

Podriamos usar una funcion creada por nosotros para chequear el referer tambien:
Cita:
function valid_referer() {
$r = @$_SERVER['HTTP_REFERER'];
if(!strlen($r)) return TRUE; // empty referer ok... esto habria que analizar que conviene más
$p = parse_url($r);
return strcasecmp(@$p['host'], $_SERVER['HTTP_HOST']) === 0;
}
Si alguien conoce alguna más siempre es bienvenido.

Última edición por enridp; 10/10/2010 a las 15:03
  #2 (permalink)  
Antiguo 14/10/2010, 10:43
 
Fecha de Ingreso: mayo-2005
Mensajes: 284
Antigüedad: 18 años, 10 meses
Puntos: 11
Respuesta: Sesiones cookies seguridad y cefalea

Y otra dilema más:

Que es mejor, usar el sistema de archivos de las sesiones o guradar los datos en una base de datos?

En principio creo que si usamos una base de datos para guardar los datos de la sessión, podemos controlar mejor cuando expiran estos datos.

Pero no parece ser una tarea frecuente, asique tal vez tiene alguna desventaja (en cuanto a velocidad creo que es unos milisegundos más lento, pero no creo que esto tenga importancia).

Etiquetas: cookies, seguridad, sesiones
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 06:52.