2012-05-29 18 views
5

Estoy tratando de averiguar cómo evitar el secuestro de la sesión. Esto es lo que estaba pensando hacer:PHP Comprobando el agente de usuario y el IP para evitar el secuestro de la sesión

Junto con la sesión de identificación de usuario, agregue un agente de usuario y una sesión de IP de usuario también. Cada vez que se carga una página, se verificarán estas sesiones para ver si coinciden, ¿será suficiente? Por ejemplo:

<?php 

$userIp = $_SESSION['userIp']; 
$userAgent = $_SESSION['userAgent']; 

if ($userIp != $_SERVER['REMOTE_ADDR'] || $userAgent != $_SERVER['HTTP_USER_AGENT'] { 
    session_destroy(); 
} 

?> 

Gracias.

Respuesta

11

Es mucho más complejo que eso. Su sitio/servicio será accedido por una variedad de personas con diferentes configuraciones. Lo primero que puede salir mal es si alguien está pasando por un servidor proxy. La IP que verá su aplicación puede cambiar, y la sesión se reducirá incluso para un usuario válido.

Si necesita hacer algo con la IP, lo máximo que puede hacer sin obtener demasiados falsos positivos es verificar el país/región de origen. Si detecta un inicio de sesión de Canadá y otro de la India, puede haber un problema. Incluso entonces, no es a prueba de tontos.

El agente de usuario también es muy fácil de falsificar: si puedo obtener el PHPSESSIONID de alguien, entonces definitivamente puedo obtener su agente de usuario también. Así que no se ha logrado mucho aquí.

La mejor manera de proteger la sesión de alguien es poner todo autenticado detrás de HTTPS y asegurarse de que la cookie de sesión sea solo HTTPS.

EDITAR: Si se trata del punto en el que los datos que está protegiendo detrás de la sesión es extremadamente sensible, y sus usuarios deben ser conscientes de ello, siempre se les puede mostrar otras sesiones que se registran en su usuarios. Lo mismo hace GMail, por ejemplo.

+0

Gracias por la respuesta. No me molesta demasiado el primer punto para ser honesto, pero tu segundo es válido. Si no puedo encontrar una manera de prevenir esto, solo usaré HTTPS. –

+1

Gracias! Por cierto, cualquiera que sea la opción con la que decida ir, siempre sugeriría agregar HTTPS en la parte superior. La proliferación de hotspots WiFi públicos significa que todo lo que funciona sin HTTPS está prácticamente abierto para que todos lo vean. –

+0

Dado que solo desea utilizar http, el usuario y la contraseña de su usuario ya pueden obtenerlos si el usuario no utiliza vpn. Ni siquiera necesitas pensar para la sesión. –

1

Estoy de acuerdo con z42

También me gustaría sugerir un enfoque, cada vez que un usuario de inicio de sesión con éxito a su sitio puede generar una sal y almacenarlo en una sesión y en su aswell db, y hacer que las condiciones para verificar si el usuario ya está conectado o no, con esto no puede evitar que varios usuarios inicien sesión con la misma cuenta más de una vez y destruya SALT de db cuando el usuario cierre la sesión.

+0

Gracias por la sugerencia, ¡muy útil! Me aseguraré de hacer uso de esta técnica. –

+1

Bienvenido. :) –

Cuestiones relacionadas