Al asegurar las configuraciones INI de sesiones, los desarrolladores
pueden experimentar la seguridad de las sesiones. Muchas configuraciones
INI no tienen una configuración recomendada. Los desarrolladores son
responsables de la correcta configuración de las sesiones.
-
session.cookie_lifetime=0
El valor 0
tiene un significado importante.
Informa a los navegadores de no almacenar la cookie en un
espacio de almacenamiento permanente. También, cuando el navegador se cierra,
la cookie de identificación de sesión es eliminada inmediatamente.
Si los desarrolladores definen un valor diferente de 0, permite
a otros usuarios utilizar el identificador de sesión. La
mayoría de las aplicaciones deben utilizar "0
" como
valor.
Si se desea una funcionalidad de auto-identificación, los desarrolladores
deben implementar su propio sistema de auto-identificación seguro.
No utilice identificadores de sesión de larga duración para esto.
Para más información, consulte la sección adecuada de esta documentación.
-
session.use_cookies=On
session.use_only_cookies=On
Aunque las cookies HTTP sufren de problemas técnicos, siguen siendo
la forma preferida de gestionar los identificadores de sesiones.
Utilice solo cookies para la gestión de identificadores de sesiones
cuando sea posible. La mayoría de las aplicaciones deben utilizar
una cookie para el identificador de sesión.
Si session.use_only_cookies=Off,
el módulo de sesión utilizará los valores del identificador
de sesión definidos por las variables GET o POST proporcionadas,
y la cookie del identificador de sesión no será inicializada.
-
session.use_strict_mode=On
Aunque la activación de session.use_strict_mode
es obligatoria para la seguridad de las sesiones, esta directiva está
desactivada por defecto.
Este modo evita que el módulo de sesión utilice un identificador de sesión
no inicializado. Dicho de otra forma, el módulo de sesión solo va a aceptar
identificadores de sesiones válidos generados por el módulo de sesión.
Rechazará todos los identificadores de sesión proporcionados por los usuarios.
Debido a la especificación de cookies, los atacantes son capaces
de colocar cookies que contienen identificadores de sesiones configurando
localmente una base de datos de cookies o mediante inyecciones Javascript.
session.use_strict_mode puede evitar que un atacante
inicialice un identificador de sesión.
Nota:
Los atacantes pueden inicializar un identificador de sesión con su
propio dispositivo, y pueden definir el identificador de sesión
de su víctima. Deben entonces mantener el identificador de sesión
activo para poder abusar de él.
Los atacantes deben pasar por muchos otros pasos para tener éxito en su ataque
en este escenario. También, el uso de la directiva
session.use_strict_mode permite limitar los riesgos.
-
session.cookie_httponly=On
Permite rechazar el acceso a una cookie de sesión desde javascript.
Esta configuración evita que una cookie sea corrompida por una
inyección Javascript.
Es posible utilizar un identificador de sesión como token CSRF, pero
no es recomendado. Por ejemplo, fuentes HTML pueden ser
guardadas y enviadas a otros usuarios.
Los desarrolladores no deben escribir los identificadores de sesión en las
páginas web por razones de seguridad. Todas las aplicaciones web deben
utilizar el atributo httponly para la cookie que contiene el identificador de sesión.
Nota:
El token CSRF debe ser renovado periódicamente, al igual que el identificador
de sesión.
-
session.cookie_secure=On
Permite acceder a la cookie de identificador de sesión únicamente cuando
el protocolo es HTTPS. Si un sitio web solo es accesible por HTTPS,
esta directiva debe ser activada.
HSTS debe ser utilizado para los sitios web accesibles solo por HTTPS.
-
session.cookie_samesite="Lax" o
session.cookie_samesite="Strict"
Desde PHP 7.3, el atributo "SameSite"
puede ser definido
para la cookie de identificador de sesión. Este atributo es una forma de
mitigar los ataques CSRF (Cross Site Request Forgery).
La diferencia entre Lax y Strict es la accesibilidad de la cookie en las peticiones
originadas de otros dominios empleando el método HTTP GET.
Las cookies utilizando Lax serán accesibles mediante una petición GET originada
de otro dominio, mientras que las cookies utilizando Strict no lo serán.
-
session.gc_maxlifetime=[elija el más pequeño posible]
session.gc_maxlifetime es una configuración para eliminar
el identificador de sesión obsoleto. Confiar
completamente en esta configuración no es recomendado.
Los desarrolladores deben gestionar la duración de las sesiones con un timestamp
por ellos mismos.
La GC de sesiones (recolección de basura) es mejor realizada utilizando
la función session_gc().
La función session_gc() debe ser ejecutada por un gestor
de tareas; por ejemplo, un cron en los sistemas Unix.
GC es ejecutado por probabilidad, por defecto. Esta configuración
no garantiza que las sesiones antiguas sean
eliminadas. Aunque los desarrolladores no deben basarse en este parámetro,
se recomienda definirlo con el valor más pequeño posible.
Debe ajustarse las directivas session.gc_probability
y session.gc_divisor de modo que
las sesiones obsoletas sean eliminadas con la frecuencia apropiada.
Si la funcionalidad de auto-identificación es necesaria, los desarrolladores
deben implementar su propia funcionalidad de auto-identificación segura;
consulte a continuación para más información. Nunca utilice el identificador
de sesión de larga duración para realizar este tipo de funcionalidad.
Nota:
Algunos módulos de gestión de guardado de sesiones no utilizan esta
funcionalidad basada en expiración y probabilidad; por ejemplo,
memcached, memcache. Consulte la documentación de estos gestores
de guardado de sesiones para más detalles.
-
session.use_trans_sid=Off
El uso de un gestor de identificadores de sesiones transparente
no está prohibido. Los desarrolladores deben emplearlo cuando sea necesario.
Sin embargo, la desactivación de la gestión de identificadores de sesión de
forma transparente permite asegurar un poco más los identificadores de sesión
eliminando la posibilidad de una inyección de identificador de sesión o
fuga de este identificador.
Nota:
El identificador de sesión puede filtrarse desde URLs guardadas,
URLs en emails, una fuente HTML guardada, etc...
-
session.trans_sid_tags=[banderas limitadas]
(PHP 7.1.0 >=) Los desarrolladores no deben reescribir banderas HTML
innecesarias. El valor por defecto debe ser suficiente para
la mayoría de los usos. Para versiones de PHP más antiguas,
utilice en su lugar
url_rewriter.tags.
-
session.trans_sid_hosts=[hosts limitados]
(PHP 7.1.0 >=) Este parámetro define una lista blanca de hosts que están
autorizados a reescribir los identificadores de sesión transparentes. ¡Nunca
añada hosts que no sean de confianza!
El módulo de sesión solo autoriza $_SERVER['HTTP_HOST']
cuando este parámetro está vacío.
-
session.referer_check=[URL de origen]
Cuando el parámetro session.use_trans_sid
está activo.
Este parámetro reduce los riesgos de inyección de identificador de sesión.
Si un sitio web es http://example.com/
,
defina como valor para este parámetro http://example.com/
.
Tenga en cuenta que los navegadores HTTPS no envían el encabezado referrer.
Los navegadores pueden no enviar el encabezado referrer debido
a su propia configuración. Por lo tanto, este parámetro no puede ser
considerado como una medida fiable de seguridad.
A pesar de todo, su uso es recomendado.
-
session.cache_limiter=nocache
Asegura que el contenido HTTP no sea almacenado en caché para las sesiones
autenticadas. Permite el almacenamiento en caché solo para los contenidos
que no son privados. De lo contrario, el contenido será expuesto.
El valor "private"
debe ser empleado si el contenido HTTP no incluye
datos sensibles desde un punto de vista de seguridad. Tenga en cuenta que "private"
puede transmitir datos privados almacenados en caché para los clientes
compartidos. "public"
solo debe ser utilizado cuando el contenido HTML
no contiene ningún dato privado.
-
session.hash_function="sha256"
(PHP 7.1.0 <) Una función de hash fuerte generará un identificador
de sesión fuerte. Aunque una colisión de hash es poco probable con algoritmos
de hash MD5, los desarrolladores deben utilizar SHA-2 o un
algoritmo de hash más fuerte como sha384 y sha512.
Los desarrolladores deben asegurarse de una longitud suficiente de
la entropía para la
función de hash utilizada.
-
session.save_path=[directorio no legible por todos]
Si este parámetro está definido a un directorio accesible en lectura por todos,
como /tmp (por defecto), otros usuarios del servidor
serán capaces de recuperar las sesiones listando los archivos presentes
en este directorio.