Seguridad de Sesión PHP


¿Cuáles son algunas pautas para mantener una seguridad de sesión responsable con PHP? Hay información en toda la web y es hora de que todo aterrice en un solo lugar!

 125
Author: mattytommo, 0000-00-00

12 answers

Hay un par de cosas que hacer para mantener su sesión segura:

  1. Utilice SSL cuando autentique usuarios o realice operaciones confidenciales.
  2. Regenere el id de sesión cada vez que cambie el nivel de seguridad (como iniciar sesión). Incluso puede regenerar el id de sesión cada solicitud si lo desea.
  3. Tener sesiones tiempo fuera
  4. No utilice register globals
  5. Almacene los detalles de autenticación en el servidor. Es decir, no envíe detalles como nombre de usuario en cookie.
  6. Marque $_SERVER['HTTP_USER_AGENT']. Esto añade una pequeña barrera al secuestro de sesiones. También puede comprobar la dirección IP. Pero esto causa problemas para los usuarios que tienen una dirección IP cambiante debido al equilibrio de carga en múltiples conexiones a Internet, etc. (que es el caso en nuestro entorno aquí).
  7. Bloquee el acceso a las sesiones en el sistema de archivos o utilice el manejo de sesiones personalizado
  8. Para operaciones sensibles, considere requerir que los usuarios registrados proporcionen sus detalles de autenticación de nuevo
 88
Author: grom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-06 17:37:35

Una pauta es llamar a session_regenerate_id cada vez que cambia el nivel de seguridad de una sesión. Esto ayuda a prevenir el secuestro de sesiones.

 15
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-02 02:43:42

Mis dos (o más) centavos:

  • No confíes en nadie
  • Entrada de filtro, salida de escape (cookie, datos de sesión son su entrada también)
  • Evite XSS (mantenga su HTML bien formado, eche un vistazo a PHPTAL o HTMLPurifier )
  • Defensa en profundidad
  • no exponer datos

Hay un pequeño pero bueno libro sobre este tema: Essential PHP Security por Chris Shiflett.

Seguridad Básica de PHP http://shiflett.org/images/essential-php-security-small.png

En la página de inicio del libro encontrará algunos ejemplos de código interesantes y capítulos de muestra.

Puede utilizar la técnica mencionada anteriormente (IP & UserAgent), descrita aquí: Cómo evitar el robo de identidad

 11
Author: takeshin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-06 16:25:03

Creo que uno de los principales problemas (que se está abordando en PHP 6) es register_globals. En este momento uno de los métodos estándar utilizados para evitar register_globals es utilizar el $_REQUEST, $_GET o $_POST matrices.

La forma "correcta" de hacerlo (a partir de la versión 5.2, aunque hay un poco de errores, pero estable a partir de la versión 6, que llegará pronto) es a través de filtros.

Así que en lugar de:

$username = $_POST["username"];

Usted haría:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

O incluso solo:

$username = filter_input(INPUT_POST, 'username');
 11
Author: cmcculloh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-04 09:41:40

Este papel de fijación de sesión tiene muy buenos punteros donde el ataque puede venir. Véase también página de fijación de sesión en Wikipedia.

 9
Author: raspi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-05 22:33:27

Usar la dirección IP no es realmente la mejor idea en mi experiencia. Por ejemplo, mi oficina tiene dos direcciones IP que se utilizan dependiendo de la carga y nos encontramos constantemente con problemas utilizando direcciones IP.

En su lugar, he optado por almacenar las sesiones en una base de datos separada para los dominios en mis servidores. De esta manera nadie en el sistema de archivos tiene acceso a esa información de sesión. Esto fue muy útil con phpBB antes de la versión 3.0 (ya lo han arreglado), pero creo que sigue siendo una buena idea.

 5
Author: Eric Lamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 20:44:55

Esto es bastante trivial y obvio, pero asegúrese de session_destroy después de cada uso. Esto puede ser difícil de implementar si el usuario no cierra sesión explícitamente, por lo que se puede configurar un temporizador para hacer esto.

Aquí hay un buen tutorial sobre SetTimer() y clearTimer().

 3
Author: helloandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-02 03:24:12

El principal problema con las sesiones y la seguridad de PHP (además del secuestro de sesiones) viene con el entorno en el que se encuentra. Por defecto PHP almacena los datos de la sesión en un archivo en el directorio temp del sistema operativo. Sin ningún pensamiento o planificación especial, este es un directorio legible en todo el mundo, por lo que toda la información de su sesión es pública para cualquier persona con acceso al servidor.

En cuanto al mantenimiento de sesiones sobre varios servidores. En ese punto sería mejor cambiar PHP a sesiones manejadas por el usuario donde llama a sus funciones proporcionadas a CRUD (create, read, update, delete) los datos de la sesión. En ese punto, podría almacenar la información de la sesión en una base de datos o solución similar a memcache para que todos los servidores de aplicaciones tengan acceso a los datos.

Almacenar sus propias sesiones también puede ser ventajoso si está en un servidor compartido porque le permitirá almacenarlo en la base de datos que a menudo tiene más control sobre el sistema de archivos.

 3
Author: John Downey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-03 13:14:48

Configuré mis sesiones de esta manera -

En la página de inicio de sesión:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(frase definida en una página de configuración)

Luego en el encabezado que está en todo el resto del sitio:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
 3
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 22:00:12

Php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

Eq Apache add header:

X-XSS-Protection    1
 3
Author: user956584,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-13 02:40:01

Revisaría tanto la IP como el Agente de usuario para ver si cambian

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
 2
Author: Teifion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-04 21:38:05
 
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61