Sesiones
Sesiones
1. Importancia de la seguridad en los aplicativos web
Cada vez es más habitual el uso de aplicaciones y tecnologías web en empresas o Gobiernos. Su fácil implementación y uso han hecho que sean prácticamente omnipresentes y esenciales en el comercio electrónico y aplicaciones intranet o extranet. Por lo tanto, información sensible y crítica es manejada a través de aplicaciones web.
Según estudios, una gran cantidad de sitios web son vulnerables a ataques surgiendo en los últimos años dos tendencias en el mercado de seguridad:
· Los atacantes no actúan por razones de prestigio personal, sino por obtener ingresos a través del fraude.
· Las aplicaciones web se han convertido en el objetivo para las operaciones de hackers. Según el grupo Gartner, se estima que el 75% de los ataques tienen como objetivo este tipo de aplicaciones.
Actualmente, en gran medida la reputación de una empresa está en manos de la aplicación web utilizada. Según una encuesta realizada en EE.UU., el 60% de los Clientes cesarían su relación con una empresa si sus datos personales estuvieran en riesgo de sufrir un ataque.
Desde el punto de vista de un administrador de un sitio web, la seguridad de una aplicación web no puede ser ignorada. Las decisiones de seguridad han de ser tomadas durante todo el ciclo de vida del proyecto: desde la fase de diseño hasta la de puesta en producción. Aunque es necesario conocer aspectos técnicos, herramientas y metodologías para securizar una aplicación web, también es importante considerar el factor humano. Cualquier usuario que acceda a la aplicación debe conocer y hacer uso de buenas prácticas.
2. Funciones comunes
session_abort — Desecha los cambios en el array de sesión y finaliza la sesión
session_cache_expire — Devuelve la caducidad de la caché actual
session_cache_limiter — Obtener y/o establecer el limitador de caché actual
session_commit — Alias de session_write_close
session_create_id — Crear un nuevo ID de sesión
session_decode — Decodifica la información de sesión desde una cadena de sesión codificada
session_destroy — Destruye toda la información registrada de una sesión
session_encode — Codifica los datos de la sesión actual como un string codificado de sesión
session_gc — Realizar una recolección de basura de datos de sesión
session_get_cookie_params — Obtener los parámetros de la cookie de sesión
session_id — Obtener y/o establecer el id de sesión actual
session_is_registered — Averiguar si una variable global está registrada en una sesión
session_module_name — Obtiene y/o establece el módulo de sesión actual
session_name — Obtener y/o establecer el nombre de la sesión actual
session_regenerate_id — Actualiza el id de sesión actual con uno generado más reciente
session_register_shutdown — Función de cierre de sesiones
session_register — Registrar una o más variables globales con la sesión actual
session_reset — Reinicializar el array de sesión con los valores originales
session_save_path — Obtener y/o establecer la ruta de almacenamiento de la sesión actual
session_set_cookie_params — Establecer los parámetros de la cookie de sesión
session_set_save_handler — Establece funciones de almacenamiento de sesiones a nivel de usuario
session_start — Iniciar una nueva sesión o reanudar la existente
session_status — Devuelve el estado de la sesión actual
session_unregister — Deja de registrar una variable global de la sesión actual
session_unset — Libera todas las variables de sesión
session_write_close — Escribir información de sesión y finalizar la sesión
2. Creación de usuarios
https://web.tursos.com/como-hacer-un-sistema-de-registro-de-usuarios-en-php-mysql/
3. Métodos de acceso
Junto con un nombre de usuario y contraseña, las cuentas de usuario también contienen información de acceso. Esta información toma formas diferentes de acuerdo al sistema operativo utilizado. Sin embargo, los tipos de información a menudo incluyen:
· Identificación específica al usuario global al sistema
· Identificación específica al grupo global al sistema
· Lista de los grupos/capacidades adicionales a los cuales el usuario es miembro
· Información de acceso por defecto a aplicar para todos los archivos y recursoscreados por el usuario
En algunas organizaciones, la información de control de acceso quizás nunca se necesite tocar. Este caso es más frecuente con estaciones de trabajo personales y sistemas independientes, por ejemplo. Otras organizaciones, particularmente aquellas que hacen uso extensivo de los recursos compartidos a los largo de la red entre diferentes grupos de usuarios, requieren que la información de control de acceso se modifique con frecuencia.
La carga de trabajo requerida para mantener apropiadamente la información de control de acceso de sus usuarios varía de acuerdo a cuan intensivamente su organización utiliza las funcionalidades de control de acceso. Mientras que no esta mal contar con estas funcionalidades (de hecho, quizás sea inevitable), implica que su entorno de sistema puede requerir más esfuerzo para ser mantenido y que cada cuenta de usuario pueda tener más formas en las cuales pueda ser mal configurada.
Por lo tanto, si su organización requiere de este tipo de entorno, debería documentar los pasos exactos requeridos para crear y correctamente configurar una cuenta de usuario. De hecho, si hay diferentes tipos de cuentas de usuario, debería documentar cada una (creando una nueva cuenta de usuario de finanzas, una nueva cuenta de usuario de operaciones, etc.).
Administración día a día de cuentas y acceso a recursos
Como dice el viejo dicho, lo único constante es el cambio. Es lo mismo cuando se trata de su comunidad de usuarios. Gente viene, se vá y también hay gente que se mueve de un grupo de responsabilidades a otro. Por lo tanto, los administradores de sistemas deben ser capaces de responder a los cambios que son una parte normal de la vida diaria de su organización.
Nuevos empleados
Cuando una nueva persona entra a la organización, normalmente se les da acceso a varios recursos (dependiendo de sus responsabilidades). Quizás se les facilite un lugar para trabajar, un teléfono y una llave para la puerta de entrada.
Probablemente también se les da acceso a uno o más computadoras en su organización. Como administrador del sistema, es su responsabilidad verificar que esto se haga rápidamente y de la forma adecuada. ¿Cómo hacerlo?
Antes de hacer algo, primero debe estar al tanto de la llegada de la nueva persona. Esto se maneja de diferentes formas en varias organizaciones. He aquí algunas posibilidades:
· Cree un procedimiento donde el departamento de personal de su organización le notifica cuando llega una nueva persona.
· Cree una forma que el supervisor de la nueva persona debe llenar y utilizar para solicitar la creación de una cuenta de usuario.
Diferentes organizaciones tienen enfoques diferentes. No importa como se lleve a cabo, es vital que tenga un procedimiento confiable que pueda alertar de cualquier trabajo relacionado a las cuentas que se necesite hacer.
4. Cierre de sesión
Cierre de sesión por inactividad en PHP: módulo de control de datos
Algo que puede parecer muy obvio para unos y muy complejo para otros, pero que innegablemente muchos de nosotros nos hemos preguntado en algún momento: ¿Cómo caducar una sesión en PHP?
Ahora veremos que tan sencillo es. Solo tendremos que:
· Crear una nueva sesión que guarde una fecha y hora
· Comprobar en nuestra capa de seguridad el tiempo transcurrido entre la sesión guardada y la hora actual
· Actualizar la sesión o destruirla según corresponda
Lo primero que debemos hacer entonces, es crear la nueva sesión y asignarle como valor, la hora actual. Esto lo haremos en el momento que el usuario ingresa al sistema con sus datos de acceso.
<?
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="miguel" && $_POST["contrasena"]=="qwerty"){
//usuario y contraseña válidos
session_name("loginUsuario");
//asigno un nombre a la sesión para poder guardar diferentes datos
session_start();
// inicio la sesión
$_SESSION["autentificado"]= "SI";
//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: aplicacion.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.php?errorusuario=si");
}
?>
Cierre de sesión por inactividad en PHP: módulo de seguridad
El segundo paso, será comprobar el tiempo transcurrido entre la fecha guardada y la hora actual en nuestra capa de seguridad y actuar en consecuencia.
Para hacerlo, tendremos que realizar un cálculo muy sencillo:
tiempo transcurrido = (hora actual - fecha guardada)
Y luego, restará saber si el tiempo transcurrido es mayor, menor o igual que el tiempo de caducidad de la sesión (representado como "x"):
si (tiempo transcurrido >= x), actúo en consecuencia a lo hallado
Para efectuar estos cálculos utilizaremos como unidad de tiempo el segundo. En nuestro ejemplo, caducaremos la sesión, transcurridos 10 minutos de inactividad (donde: 10*60 = 600 segundos). Para efectuar estos cálculos y tomar como unidad de medida el segundo, será necesario convertir las fechas a segundos. Para ello, utilizaremos la función strtotime.
Por lo tanto, calcularemos el tiempo transcurrido (tiempo transcurrido = (hora actual - fecha guardada)) de la siguiente manera:
<?
//iniciamos la sesión
session_name("loginUsuario");
session_start();
//antes de hacer los cálculos, compruebo que el usuario está logueado
//utilizamos el mismo script que antes
if ($_SESSION["autentificado"] != "SI") {
//si no está logueado lo envío a la página de autentificación
header("Location: index.php");
} else {
//sino, calculamos el tiempo transcurrido
$fechaGuardada = $_SESSION["ultimoAcceso"];
$ahora = date("Y-n-j H:i:s");
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));
//comparamos el tiempo transcurrido
if($tiempo_transcurrido >= 600) {
//si pasaron 10 minutos o más
session_destroy(); // destruyo la sesión
header("Location: index.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
}
?>
5. Encriptación de contraseñas
Modelo de almacenamiento encriptado
SSL/SSH protege los datos que viajan desde el cliente al servidor: SSL/SSH no protege los datos persistentes almacenados en una base de datos. SSL es un protocolo que protege los datos mientras viajan por el cable.
Una vez que un atacante obtiene acceso directo a una base de datos (eludiendo el servidor web), los datos sensibles almacenados podrían ser divulgados o mal utilizados, a menos que la información esté protegida por la base de datos misma. Encriptar los datos es una buena forma de mitigar esta amenaza, pero muy pocas bases de datos ofrecen este tipo de encriptación de datos.
La forma más sencilla para evitar este problema es crear primero un paquete de encriptación propio y utilizarlo en los scripts de PHP. Hay muchas extensiones de PHP que pueden ser de ayuda para esto, tales como Mcrypt y Mhash, cubriendo así una amplia variedad de algoritmos de encriptación. El script encripta los datos antes de insertarlos en la base de datos, y los desencripta al obtenerlos. Véanse las referencias para ejemplos adicionales del funcionamiento de la encriptación.
'Hashing' ¶
En caso de datos que deban estar realmente ocultos, si no fuera necesaria su representación real, (es decir, que no sean mostrados), quizás convenga utilizar algoritmos hash. El ejemplo más típico del uso del hash es a la hora de almacenar el hash criptográfico de una contraseña en una base de datos, en lugar de almacenar la contraseña en sí.
En PHP 5.5 o posterior las funciones de password proporcionan una forma adecuada de utilizar hash con datos delicados y trabajar con estos hash. En PHP 5.3.7+ se puede utilizar también la biblioteca » password_compat.
password_hash() se emplea para usar un hash con una cadena dada utilizando el algoritmo más fuerte actualmente disponible, mientras que password_verify() comprueba si la contraseña dada coincide con el hash almacenado en la base de datos.
Ejemplo #1 Campo de contraseña con hash
<?php
// Almacenar el hash de la contraseña
$consulta = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($nombre_usuario),
password_hash($contraseña, PASSWORD_DEFAULT));
$resultado = pg_query($conexión, $consulta);
// Consultar si el usuario envió la contraseña correcta
$consulta = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($nombre_usuario));
$fila = pg_fetch_assoc(pg_query($conexión, $consulta));
if ($fila && password_verify($contraseña, $fila['pwd'])) {
echo 'Bienvenido, ' . htmlspecialchars($nombre_usuario) . '!';
} else {
echo 'La autenticación ha fallado para ' . htmlspecialchars($nombre_usuario) . '.';
}
?>
Leer más: https://laurasistemas.webnode.es/programacion-web-ii/actividades/sesiones/