paginas - php session put
Comportamiento de sesiĆ³n curioso(longitud de cadena de nombre de archivo) (2)
En el archivo php.ini, puedes verificar hash algo
; Select a hash function for use in generating session ids.
; Possible Values
; 0 (MD5 128 bits)
; 1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function = 0
Ahora mira en http://php.net/manual/en/function.hash-algos.php , proporciona un índice de uso de diferentes tipos de algoritmos
Para hacer 5 + 128 caracteres de largo puede usar el algoritmo sha512
o whirlpool
para generar ID de sesión. Compruebe la longitud del método hash http://php.net/manual/en/function.hash.php
El nombre del archivo de sesión debe ser sess_
+ session_id
Entonces en tu php.ini
puedes configurar
session.hash_function = whirlpool
session.hash_function = sha512
o en PHP puedes establecer dinámicamente antes de la función start_session ()
ini_set(''session.hash_function'', ''whirlpool'');
ini_set(''session.hash_function'', ''sha512'');
He probado con la función ini_set (), funciona bien para mí y genera un archivo de sesión de 5 + 128 caracteres.
Mi código de archivo PHP
<?php
ini_set(''session.hash_function'', ''whirlpool'');
session_start();
echo "Session ID: " . session_id();
Salida:
Session ID: 0216691c286f2023c6bad823952bcfbdd1cb51980e1981afa28418e887209dcfae3443dc3b59ecaf6201c5d1ea18cd4eb8810de69668a5a366e3c98396ca3786
Hoy noté que en mis archivos de sesión para un sitio, hay algunos archivos con nombres de archivo significativamente más pequeños que el resto, por ejemplo:
Archivo de sesión estándar:
sess_0020cc255681808f78c08b67cd88cbcea13f45ee7629754ed82ccb8b010cf83d2b353b7136847f2876d99f3297a5def5bcc62b433d6d56d7f1b301f82c833aad
(5 + 128 caracteres de longitud de archivo)
Archivo de sesión excepcional:
sess_629aca24e094f17d02b3d105ebe9e5d4
(5 + 32 caracteres de longitud de archivo)
Este sitio está muy ocupado y tiene mucho tráfico (~ 22k visitantes pcm), al ver la carpeta de la sesión hay ~ 1% (en realidad 0.92% ) de estos archivos de sesión con nombres muy cortos.
En el pasado he leído mucho sobre las sesiones antes de implementar este rediseño del sitio el año pasado (2015) y de eso, actualmente tengo en mi php.ini
:
session.cookie_httponly=1
session.use_only_cookies=1
session.cookie_secure=1
session.entropy_file=/dev/urandom
session.hash_function=whirlpool
session.session.use_trans_sid=0
session.entropy_length=32
EDITAR (adicionales):
session.hash_bits_per_character = 4
session.sid_length
no está definido (indefinible) ya que esta versión usa PHP 5.6.2
Que, por lo que sé, debería ser generalmente bueno. He leído muy pocos otros temas sobre cómo garantizar la longitud mínima del archivo, aunque he leído varias cosas sobre el uso de session.entropy_length
pero esto no parece aplicarse obviamente a este problema.
El valor de entropy_length es el único que no estoy seguro de su uso y necesidad.
Mis preguntas
- ¿Qué causa que el 1% de las sesiones tenga solo 5 + 32 caracteres de largo?
- ¿Cómo lo configuro para que todas las sesiones tengan la misma duración (5 + 128 caracteres)?
Me doy cuenta de que la siguiente pregunta puedo probar y ver, ya que no causa ningún daño, pero si la solución anterior es el uso previsto para session.entropy_length
, sería útil saberlo.Parece que hay poca literatura acerca de lo que entropy_length es, en realidad, práctico.
-
¿Aumentará el aumento del valor de la longitud de entropía de la sesión?[NO]
Creo que actualmente puede haber un pequeño problema potencial con la colisión del nombre de sesión , y se ve francamente mal cómo tantos archivos de sesión son tan maravillosamente largos, pero una minoría notable es relativamente pequeña.
Actualizaciones
De los comentarios hay algunos detalles que puede valer la pena resumir aquí:
- El problema no es con mi navegador (!!)
- Esto está usando PHP Version 5.6.2
- Apilamiento LAMP en un servidor WHM [único].
- Si se ejecuta PHP-cli, podría / debería ser ejecutado únicamente por los servidores del servidor, aunque realmente dudo que lo estén ejecutando. Los conozco bien y soy un cliente decente, así que ...
- Revisé y confirmé que los archivos
htaccess
del sitio web no están haciendo ningún cambio en ningún aspecto de PHP - El servidor se ejecuta con muy pocos registros de errores (tengo 14 errores de la última semana, de 9k visitas, errores todos los 404 de raspadores de robots que intentan hackear Wordpress [el sitio no es wordpress]).
- PHP se ejecuta a través de suPHP (versión desconocida en la actualidad), también estoy buscando actualizar suphp, pero dudo que esto se relacione directamente con este problema.
- De la sugerencia de Ryan Vincents voy a configurar una notificación cuando se realice una sesión más corta que 128chr (y con suerte desde qué dirección)
- La carpeta de almacenamiento del archivo de sesión se define en PHP.ini y, por lo tanto, si se usa un PHP.ini externo, entonces esperaría que las sesiones aparezcan en otras carpetas como
/temp
.
Es muy probable que se trate de piratas informáticos / intentos de pirateo si tienes un sitio tan popular como el que describes. Los piratas informáticos atacarán el sitio con bastante regularidad y utilizarán identificadores de sesión capturados o (en este caso) suplantados, y se burlarán en el hexágono normal de 32 bytes.
Si modifica la cookie "PHPSESSID" para contener cualquier texto, PHP lo recoge y crea una sesión con esa ID, y un archivo sess_ [sessionId] correspondiente. A partir de mis pruebas (y puedes probarlo tú mismo) PHP utilizará cualquier longitud de ID y la aceptará y usará, independientemente de la configuración de ini.
La buena noticia es que si haces un session_id()
entonces devolverá el ID falso para que puedas
- negar
- miel, o
- recrear con una sesión válida
PERO esto no detendrá el archivo de sesión que se está creando.
Alternativamente, crea tu propio sistema de manejo de sesión y evita session_start()
; entonces usted puede validar manualmente el formato session_id antes de usar.