Aquí podría ser tu PUBLICIDAD


Seguridad de sesión PHP

votos
125

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

Publicado el 02/08/2008 a las 03:41
fuente por usuario saint_groceon
En otros idiomas...        العربية       

13 respuestas

votos
88

Hay algunas cosas que hacer para mantener su sesión segura:

  1. Use SSL al autenticar usuarios o realizar operaciones confidenciales.
  2. Vuelva a generar la identificación de la sesión cada vez que cambie el nivel de seguridad (como el inicio de sesión). Incluso puede regenerar la id de la sesión en cada solicitud si lo desea.
  3. Tener sesiones de tiempo de espera
  4. No use registros globales
  5. Almacenar detalles de autenticación en el servidor. Es decir, no envíe detalles como el nombre de usuario en la cookie.
  6. Comprueba el $_SERVER['HTTP_USER_AGENT']. Esto agrega una pequeña barrera al secuestro de la sesión. También puede verificar la dirección IP. Pero esto causa problemas a los usuarios que tienen una dirección IP cambiante debido al equilibrio de carga en varias 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 use el manejo de sesión personalizado
  8. Para operaciones delicadas, considere requerir que los usuarios que hayan iniciado sesión vuelvan a proporcionar sus detalles de autenticación
Respondida el 11/08/2008 a las 03:38
fuente por usuario grom


Aquí podría ser tu PUBLICIDAD


votos
15

Una directriz 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 la sesión.

Respondida el 02/08/2008 a las 03:43
fuente por usuario saint_groceon

votos
11

Mis dos (o más) centavos:

  • No confíes en nadie
  • El filtro de entrada, salida de escape (cookies, datos de sesión son su entrada demasiado)
  • Evitar XSS (mantener su HTML bien formado, echar un vistazo a PHPTAL o HTMLPurifier )
  • Defensa en profundidad
  • No exponga los datos

Hay un pequeño pero buen libro sobre este tema: esencial Seguridad en PHP por Chris Shiflett .

Seguridad esencial PHP http://shiflett.org/images/essential-php-security-small.png

En la página principal del libro se encuentran algunos ejemplos de código y capítulos de muestra interesante.

Es posible utilizar la técnica mencionado anteriormente (IP y el agente de usuario), que se describe aquí: ¿Cómo evitar el robo de identidad

Respondida el 06/04/2010 a las 05:05
fuente por usuario takeshin

votos
11

Creo que uno de los principales problemas (que se aborda en PHP 6) es register_globals. En este momento uno de los métodos estándar utilizados para evitar register_globalses el uso de los $_REQUEST, $_GETo $_POSTarrays.

La forma "correcta" de hacerlo (a partir de 5.2, aunque es un poco problemático allí, pero estable a partir de 6, lo que está por venir) es a través de filtros .

Entonces, en lugar de:

$username = $_POST["username"];

tu harías:

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

o incluso solo:

$username = filter_input(INPUT_POST, 'username');
Respondida el 02/08/2008 a las 03:55
fuente por usuario cmcculloh

votos
9

El documento de fijación de esta sesión tiene muy buenos indicadores para el ataque. Ver también la página de fijación de sesión en Wikipedia .

Respondida el 05/03/2009 a las 11:33
fuente por usuario raspi

votos
5

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 constantemente nos encontramos con problemas al usar direcciones IP.

En cambio, opté por almacenar las sesiones en una base de datos separada para los dominios en mis servidores. De esta forma, nadie en el sistema de archivos tiene acceso a esa información de sesión. Esto fue realmente útil con phpBB antes de 3.0 (desde entonces han solucionado esto), pero creo que sigue siendo una buena idea.

Respondida el 06/08/2008 a las 09:44
fuente por usuario Eric Lamb

votos
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache añadir cabecera:

X-XSS-Protection    1
Respondida el 13/10/2011 a las 03:40
fuente por usuario user956584

votos
3

Me puse mis sesiones de arriba como esto:

en la página de conexión:

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

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

a continuación, en la cabecera que es a lo largo del 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();     
}
Respondida el 19/07/2011 a las 10:40
fuente por usuario Chad

votos
3

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

En cuanto a mantener sesiones en múltiples servidores. En ese punto, sería mejor cambiar PHP a sesiones manejadas por el usuario donde llama a las funciones proporcionadas a CRUD (crear, leer, actualizar, eliminar) los datos de la sesión. En ese momento, puede almacenar la información de la sesión en una base de datos o una solución tipo Memcache para que todos los servidores de aplicaciones tengan acceso a los datos.

El almacenamiento de sus propias sesiones también puede ser ventajoso si se encuentra en un servidor compartido, ya que le permitirá almacenarlo en la base de datos, que muchas veces tiene más control sobre el sistema de archivos.

Respondida el 03/08/2008 a las 02:14
fuente por usuario John Downey

votos
3

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 la sesión explícitamente, por lo que se puede configurar un temporizador para hacerlo.

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

Respondida el 02/08/2008 a las 04:16
fuente por usuario helloandre

votos
2

Debes estar seguro de que los datos de la sesión son seguros. Al mirar su php.ini o usar phpinfo () puede encontrar la configuración de la sesión. _session.save_path_ le dice dónde se guardan.

Verifique el permiso de la carpeta y de sus padres. No debe ser público (/ tmp) ni debe ser accesible desde otros sitios web en su servidor compartido.

Suponiendo que aún desea utilizar la sesión php, puede configurar php para utilizar otra carpeta cambiando _session.save_path_ o guardar los datos en la base de datos cambiando _session.save_handler_.

Usted puede ser capaz de establecer _session.save_path_ en su php.ini (algunos proveedores permiten) o para Apache + mod_php, en un archivo .htaccess en la carpeta raíz del sitio: php_value session.save_path "/home/example.com/html/session". También puede configurarlo en tiempo de ejecución con _session_save_path () _.

Consulte el tutorial de Chris Shiflett o Zend_Session_SaveHandler_DbTable para configurar un controlador de sesión alternativo.

Respondida el 18/08/2008 a las 06:12
fuente por usuario Dinoboff

votos
2

Si usa session_set_save_handler () , puede configurar su propio controlador de sesión. Por ejemplo, puede almacenar sus sesiones en la base de datos. Consulte los comentarios de php.net para ver ejemplos de un controlador de sesión de base de datos.

Las sesiones de base de datos también son buenas si tiene varios servidores. De lo contrario, si utiliza sesiones basadas en archivos, deberá asegurarse de que cada servidor web tenga acceso al mismo sistema de archivos para leer / escribir las sesiones.

Respondida el 09/08/2008 a las 04:28
fuente por usuario ejunker

votos
2

Verificaría tanto el IP como el User Agent para ver si cambian

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Respondida el 04/08/2008 a las 10:38
fuente por usuario Teifion


Aquí podría ser tu PUBLICIDAD