af Manuel Jesús González Gallardo 3 år siden
245
Mere som dette
Se debe invalidar la sesión y eliminar las cookies del cliente.
Se puede encontrar un ejemplo de código en la web de OWASP
La cookie usada por defecto, JSESSIONID, es no persistente.
En otras cookies se puede controlar a través del método setMaxAge.
Se puede utilizar la función getCreationTime, que devuelve el tiempo de creación de sesión, para establecer un tiempo máximo de sesión activa.
Se estable en la opción session-timeout del fichero web.xml
Se controla mediante la opción secure del apartado cookie-config de web.xml:
Se controla mediante la opción security-constraint del archivo web.xml.
En el código fuente de la página se puede obtener mediante el método RemoteAddr, la dirección IP del usuario, para almacenarla a continuación en la sesión y controlar que no ha cambiado en cada nueva petición web.
Se controla mediante la opción tracking-mode de web.xml.
Tampoco existe un método, para renovar el identificador, por lo que se debe finalizar la sesión actual y crear una nueva en el código fuente de la página web.
session.invalidate(); session=request.getSession(true);
Por otro lado, Apache Tomcat incluye una medida de seguridad para evitar los ataques de fijación de sesión, activada por defecto, que consiste en regenerar el identificador si el usuario se autentica.
Configurable en el servidor HTTP. Se puede hacer en el contenedor de Servlets o en el servidor web.
Se configura mediante la opción http-only de web.xml
La configuración por defecto, de aleatorización del identificador de sesión, es suficientemente buena, aunque en el pasado surgieron estudios de posibles ataques de predicción de sesión.
HttpSession session = request.getSession(true); ShoppingCart previousItems = ShoppingCart)session.getValue("previousItems"); session.putValue("referringPage", request.getHeader("Referer"));
En el código fuente de la página web se puede realizar mediante el método Session.Abandon, además hay que invalidar la cookie del navegador del cliente.
No hace falta modificar la configuración ya que la cookie de sesión ASP.NET_SessionId es no persistente.
En el código fuente de la página web se puede utilizar la función DateTime para obtener la hora de inicio de sesión, almacenarla en los datos de sesión y así poder comprobar que no ha vencido el tiempo máximo de validez de sesión en las peticiones siguientes.
Establecer un timeout de sesión
Se establece en la opción de configuración timeout de sessionState. El valor por defecto es 20 minutos.
Utilizar la opción secure en las cookies de sesión
Se activa mediante la opción requireSSL, del apartado httpCookies del archivo de configuración web.config.
Asociar el identificador con información del usuario única, como su dirección IP
Mediante el método Request.UserHostAddress puede obtenerse la dirección del cliente para ser almacenada en la sesión.
Permitir únicamente el identificador en cookies
Esta es la opción por defecto y se controla con la opción cookieless de sessionState.
Renovar el identificador, al autenticarse el usuario, o asignarlo únicamente después de la autenticación.
Otra solución, puede ser utilizar cookies distintas a la cookie de sesión por defecto, ASP.NET_SessionId, que se asignen después de la autenticación y, por tanto, el atacante no pueda conocer.
En ASP.NET no hay una función para renovar el identificador de sesión.
Una posible solución es finalizar la sesión y borrar el contenido de la cookie de sesión, en el formulario de inicio de sesión, para que después de la autenticación se asigne una cookie de sesión nueva.
Este método tiene la desventaja de que se pierde toda la información previa almacenada en la sesión.
Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
Deshabilitar el método TRACE
Configurable en el servidor HTTP. En IIS está desactivado por defecto.
Las cookies sólo han de ser accesibles a través del protocolo HTTP
Se controla mediante la opción httpOnlyCookies del archivo web.config.
Aunque se puede modificar la generación del identificador, a través de SessionIDManager, la configuración por defecto de la aleatorización del identificador de sesión es suficientemente buena.
Session["Username"] = username; ... var username = Session["Username"];
Medidas ante aspectos propios de la implementación de la gestión de sesiones de PHP
Los usuarios no deben ni poder listar los archivos ya que su nombre contiene el identificador de sesión.
En la instalación por defecto, sólo tiene acceso a ese directorio el usuario bajo el que se ejecuta el servidor web.
Restringir el acceso al directorio session.save_path donde se guardan los archivos de sesión sin encriptar.
Medidas contra los errores en el cierre de sesión
Invalidar y no reutilizar los identificadores de sesión
Cuando se destruye la sesión, mediante session.destroy, se elimina el archivo de sesión, por lo que cuando el usuario acceda de nuevo el servidor web no reconocerá la sesión. Otra cosa a tener en cuenta es invocar session_regenerate_id siempre incluyendo el parámetro "$delete_old_session =true" para inutilizar el identificador anterior.
Utilizar cookies no persistentes
El tiempo de validez de la cookie se controla mediante el parámetro session.cookie_lifetime que por defecto es 0, lo que significa que no es persistente.
Por otro lado, por defecto las cookies están restringidas al dominio y directorio raíz del servidor web (opciones controladas mediante session.cookie_domain y session.cookie_path).
Establecer un tiempo máximo de validez de sesión
Este timeout puede ser establecido mediante un código similar al anterior, utilizando el parámetro session.cookie_lifetime, etc.
Establecer un timeout de sesión.
if (!isset($_SESSION['timeout_idle'])) { $_SESSION['timeout_idle'] = time() + ini_get('session.gc_maxlifetime'); } else { if ($_SESSION['timeout_idle'] < time()) { //destroy session } else { $_SESSION['timeout_idle'] = time() + ini_get('session.gc_maxlifetime'); } }
Se puede delegar esta medida de seguridad en el mecanismo de eliminación de archivos de sesión que no han sido accedidos en el tiempo definido por session.gc_maxlifetime, pero entonces habrá que ajustar su ejecución para que no sea aleatoria y para que dependa de una tarea programada.
Medidas contra el eavesdropping
Utilizar la opción secure en las cookies de sesión: activar la opción session.cookie_secure.
Utilizar el protocolo HTTPS
Medidas contra la fijación de sesión
Asociar el identificador a información del usuario única como su dirección IP
Esta medida no tiene por qué limitarse a la dirección IP, se puede establecer un perfil más detallado a través de acciones comunes, patrones de navegación, localización, etc.
La dirección IP, que se puede obtener de la variable $_SERVER['REMOTE_ADDR'], puede almacenarse en los datos de sesión, a través de $_SESSION, y simplemente en cada nueva petición comprobar que no ha cambiado.
Permitir únicamente el identificador en cookies.
Esta restricción, activa por defecto, se controla mediante la variable session.use_only_cookies.
Renovar el identificador al autenticarse el usuario o asignarlo únicamente después de la autenticación.
Utilizar la función session_regenerate_id, siempre con el parámetro "$delete_old_session = true" para que el identificador de la sesión anterior no sea utilizable.
Medidas contra la captura del identificador a través de ataques XSS
Deshabilitar el método TRACE.
Configurable en el servidor HTTP.
Las cookies sólo han de ser accesibles a través del protocolo HTTP.
Activar la opción session.cookie_httponly que se encuentra desactivada por defecto.
Medidas contra la predicción de sesión
Aleatorización y longitud suficiente del identificador de sesión.
La configuración por defecto de aleatorización del identificador de sesión es suficientemente buena, pero se pueden añadir fuentes de datos para la generación del identificador mediante session.entropy_file y session.entropy_length para, por ejemplo, utilizar el API de Windows o el archivo /dev/random en sistemas Unix.
Procesa el resto de la página PHP que contiene la lógica de la aplicación.
Lee el identificador de sesión (generalmente de una cookie).
«Serializa» el contenido de $_SESSION y lo almacena en el archivo de sesión para su recuperación posterior.
Procesa este archivo y guarda en el array $_SESSION las variables que contiene.
Añade la cookie de sesión a la respuesta.
Busca un archivo en el directorio session.save_path cuyo nombre contiene el identificador.