Secuestro de sesiones en PHP
Written on 10:00 a.m. by Jeiff
En los últimos días he estado trabajando para mejorar la seguridad del sistema que actualmente estoy implementando, uno de los aspectos a mejorar es la seguridad en sesiones ($_SESSION).
Como todos saben PHP le asigna a cada sesión un identificador único llamado PHPSESSID, el cual se le es enviado al cliente mediante una cookie, pero del lado de nuestro servidor PHP genera un archivo con nombre de nuestro PHPSESSID, en el cual guarda la información de las variables de la sesión. De forma general así es como PHP maneja nuestras sesiones.
Informacion en una cookie:
Archivo en el servidor:
Una de las formas para lograr accesos inautorizados a nuestro sistema puede ser por medio del secuestro de la sesión de un usuario actualmente conectado al sistema.
El atacante de alguna forma podría acceder a la cookie (ejemplos aquí), de esta forma podría saber el PHPSESSID que PHP a asignado a nuestro cliente. Con esto la sesión ha sido comprometida y el atacante ahora podría acceder a nuestro sistema sin tener siquiera buscar un nombre de usuario y una contraseña, metiendo nuestra URL y en una cookie el PHPSESSID.Para poder evitar este tipo de accesos indeseados, una de las medidas que he tomado ha sido registrar la IP del cliente al momento de crear la sesión de autorización para nuestro sistema.
<?
session_start();
define(IP_CLIENTE,$_SERVER[‘REMOTE_ADDR’]); //de esta forma siempre veremos la IP del cliente
function login($usuario,$passwd,$conexion)
{
if(trim($usuario)=="" || trim($passwd)=="")
trigger_error("Usuario y/o contraseña inválidos",E_USER_ERROR);
$usuario= mysql_escape_string($usuario);
$SQL=”SELECT idUsuario,Nombre,contrasena FROM usuarios WHERE login='$usuario'”;
$rs=mysql_query($SQL,$conexion);
if($rs)
{
$registro=mysql_fetch_row($rs);
if($registro[2]==$passwd)
{
$_SESSION['IP']=IP_CLIENTE; //Guardamos la IP desde la cual se inicio la session.
$_SESSION['idUsuario']=$registro[0];
$_SESSION['Nombre']=$registro[1];
return true;
}
else
trigger_error("Usuario y/o contraseña inválidos", E_USER_ERROR);
}
}
?>
Esta es una pequeña función que hace el proceso de validación de un usuario para permitirle el ingreso al sistema, si el usuario ha tecleado correctamente su nombre de usuario y contraseña, se registran las variables en SESSION para poder identificarlo por dentro de todo nuestro sistema.
La parte importante de esta función esta en registrar la IP del cliente el cual ha tecleado correctamente la información esto con el fin de verificar si la IP que hace las peticiones de Sesiones coincide con la IP que hemos registrado. Tambien es importante comentar que la definición de IP_CLIENTE habría que colocarla dentro de algun script de PHP el cual sea incluido en todos los demás scripts de nuestro sistema, esto con el fin de que en cada pagina php podamos obtener la IP del cliente que esta accediendo a ella, y asi hacer la validación contra la IP que tenemos registrado en $_SESSION['IP'], si estas no coinciden se tendria que denegar el acceso a la pagina.
Que tal Men:
Oye respecto a este tema me surgen 2 preguntas:
1.) Esto permite entrar a cualquier IP registrada ya sea pública o privada no importando que las públicas cambian ciertos periodos de tiempo?
2.) Que tan factible es que se pueda realizar con la MAC Adress en lugar de una IP?
Saludos y buen tip.
Hola buen hombre:
Bueno la idea de registrar la IP del cliente que tecleo correctamente el nombre de usuario y contraseña es para asegurar que esa sesion solo sea utilizada por el. Aglo importante es que en cada script php se obtenga la IP de la que se haya recibido la petición para compararla con la que hemos registrado en la varibale de sesion, el unico problema es, si nuestro cliente se conecta atraves de un proveedor el cual le asigna IP cada cierto tiempo; y si el ISP le cambia la IP cuando se encuentre logeado en el sistema, lo unico que pasaria es que se le volveria a pedir que ingrese nuevamente su login y passwd.
Y me parece que en php no existe alguna funcion y/o variable que te permita conocer la MAC Address del cliente. Aunque se puede escribir una función como esta para poder obtenerla.
Ya se que es viejo el post pero...
Eduardo:
Es imposible conseguir la MAC del cliente, a menos que el cliente esté en tu misma LAN.
Excuse for that I interfere … here recently. But this theme is very close to me. Is ready to help.
Certainly. All above told the truth. Let's discuss this question.
He intención de publicar algo como esto en mi página web y me dio una idea. Saludos.