2012-05-12 8 views
8

Actualmente tengo el siguiente código para TODAS las páginas de mi sitio web. Por favor, ¿podría alguien confirmar si esta es una buena práctica para comenzar y continuar una sesión de PHP?Sesión de PHP rápida y eficiente

//************************************************************ 
//Session Settings 
//************************************************************ 

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name); 

//Set garbage collection parameters 
ini_set('session.gc_maxlifetime', $session_exp_time); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

ini_set('session.name', $session_name); 
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains 
ini_set('session.cookie_lifetime', 0); 

//Set the session cookie parameters 
session_set_cookie_params($session_exp_time, '/', ''); 

//Start or continue a session... 
@session_start(); 

if (isset($_COOKIE[$session_name])) 
setcookie($session_name, $_COOKIE[$session_name], 2147483647, ''); 

Tenga en cuenta que este script se incluye en CADA página.

Otra pregunta relacionada:

debería establecer una sesión personalizado ruta para guardar o debería sólo tiene que utilizar sesión predeterminada del servidor de ruta donde se guardan? ¿Cuáles son los pros y los contras? Por lo que entiendo, si no establece una ruta de guardado de sesión personalizada, ¿es posible que tenga algún tipo de conflicto en un alojamiento compartido? Por favor ayuda a iluminar.

¡Gracias de antemano!

+1

¿Tiene acceso a php.ini del servidor? ¿O es compatible con los archivos .htaccess? Si es así, muchas de esas entradas ini pueden ir. –

+1

También puede insertarlo en un archivo php incluido para que solo incluya el archivo cada vez, no todo el código cada vez. A menos que ya estés haciendo eso. Y como @Jack dijo php.ini o htaccess son otros lugares donde puedes agregar ese código. Sin embargo, si lo inserta en su propio archivo php y lo incluye una vez por página, eso también es una buena práctica. De esta forma, realiza 1 cambio en 1 archivo y se actualiza automáticamente en todos los lugares donde se hace referencia al archivo. – Danny

Respuesta

5

Muchas de sus declaraciones implican configuraciones de configuración de sesión; normalmente se pueden mover en el servidor php.ini o en el nivel superior .htaccess (Apache).

session.name = PHPSESSID 
session.gc_maxlifetime = 10000 

session.gc_probability = 1 
session.gc_divisor = 1000 

session.cookie_domain = 
session.cookie_path =/
session.cookie_httponly = 1 
session.cookie_lifetime = 0 

No debe hacer que las sesiones duren tanto como usted (expiración en 2038); las sesiones normalmente se perpetúan con las cookies de sesión (que duran hasta que el navegador se cierra, técnicamente). Si desea implementar una función "recordarme", le sugiero que la agregue en la parte superior de sus sesiones, como se explica aquí: http://jaspan.com/improved_persistent_login_cookie_best_practice

Me resulta importante distinguir entre iniciar una nueva sesión y reanudar una existente, especialmente en los casos en que las sesiones solo se crean como parte de un proceso de inicio de sesión. Cuando no se puede reanudar una sesión, algo salió mal y el usuario debe ser redirigido a la página de inicio de sesión (o página de inicio).

PHP no entiende esa diferencia, session_start creará automáticamente una sesión si no está allí, y peor, si se proporciona una ID de sesión arbitraria; este último permite los ataques de adopción de sesión como se describe aquí: http://gihyo.jp/dev/serial/01/php-security/0025 - está en japonés, tendrá que traducirlo con su navegador.

Para saber si una sesión se puede reanudar, debe cebar cada nueva sesión agregando una clave especial (por ejemplo, $_SESSION['_id'] = session_id()). Si se encuentra esa clave, la sesión ya existe y puede reanudarla; de lo contrario, la sesión no existía o alguien intentaba darle una identificación incorrecta.

Para comenzar una nueva sesión, primero verá si puede reanudarse; si no, usa session_regenerate_id(true) para cambiar la ID de la sesión (esto dificulta que un atacante secuestrar una sesión).

Por último, las rutas de grabación de sesión en un servidor compartido se pueden escribir en su propia carpeta de inicio, pero esto solo tiene sentido si su host compartido se ejecuta con un usuario dedicado por host virtual (es decir, suexec). De lo contrario, para proteger su sesión de los ataques de espionaje, deberá codificar los datos de la sesión (y tal vez también las claves). Consulte la extensión mcrypt: http://sg.php.net/mcrypt - debería poder encontrar ejemplos en línea.

Espero que esto responda más o menos a su pregunta. Avísame si crees que algo anda mal.

+0

Gracias por tomarse el tiempo para ayudar, Jack. Apreciar mucho. Tengo problemas para saber si la sesión puede reanudarse o no. Intenté usar: if (session_id() == '') para ver si la sesión comenzó, pero siempre devuelve TRUE, aunque la sesión ya haya comenzado. –

+0

Siempre puede llamar a session_start(), y luego buscar una clave en esa sesión como se describe, es decir, isset ($ _ SESSION ['_ started']) –

Cuestiones relacionadas