Usamos o no Cookies con las sesiones?
En PHP creo que podemos habilitar las dos opciones asi:
Código PHP:
Ver original
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:
Esto puede servir por ej. si desde un sitio externo ponen un link a nuestro sitio con: ?PHPSESSID=xxxxx session_start();
if(!isset($_SESSION['create'])){
session_regenerate_id();
$_SESSION['create'] = TRUE;
}
if(!isset($_SESSION['create'])){
session_regenerate_id();
$_SESSION['create'] = TRUE;
}
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:
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. 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";
}
}
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";
}
}
Podriamos combinarlo tambien con la IP, => IP+UserAgent para tener un valor mas único.
Cita:
Con el codigo de arriba le damos un tiempo máx. de inactividad a la session, asi no pueden reutilizarla despues de ese tiempo. $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();
// 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();
Cita:
Chequea el referer para evitar hijackings accidentales: ini_set('session.referer_check', 'tusitio.com'); //esto va antes de session_start();
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:
Si alguien conoce alguna más siempre es bienvenido. 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;
}
$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;
}