¿Cuál es la forma más actual, buena práctica y más fácil de usar sesiones en PHP?

Las sesiones en PHP parecían haber cambiado desde la última vez que las usé, así que estoy buscando una manera simple de usar las sesiones, pero al mismo tiempo, para que sea relativamente segura y una buena práctica común.

0
agregado
Puntos de vista: 2

7 Respuestas

Las sesiones fueron una parte fundamental de mi conocimiento de PHP porque me ayudaron a resolver mi problema de autenticación de inicio de sesión cuando estaba desarrollando mi primera aplicación web.

session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
    if( auth($_POST['username'], $_POST['password']) )
    {
        //Authentication passed
        $_SESSION['user'] = $_POST['username'];
       //redirect to required page
        header( "Location: index.php" );
    } 
    else 
    {
       //Authentication failed redirect to login
       header( "Location: loginform.html" );
    }
} 
else 
{
      //Username and Password are required
      header( "Location: loginform.html" );
}
0
agregado

La administración de sesiones cambió hace un tiempo (creo que fue alrededor de 4.4). El viejo mecanismo todavía funciona, pero está en desuso. Es bastante confuso, por lo que recomiendo mantenerse alejado de él. Hoy, usa sesiones accediendo a la variable global $ _SESSION (Es una matriz). Usted puede poner instancias de objeto ahí, pero necesita cargar las definiciones de clase para esos objetos antes de comenzar la sesión en la página siguiente. Usar autocarga puede ayudarte aquí.

Debe iniciar una sesión antes de poder usar $ _SESSION. Como el inicio de la sesión envía encabezados, no puede haber ningún resultado antes. Esto se puede resolver de una de estas dos maneras: O siempre comienza la sesión al comienzo de su secuencia de comandos. O puede almacenar todo el resultado , y enviarlo al final de la secuencia de comandos.

Una buena idea es regenerar la sesión en cada solicitud. esto hace que el secuestro sea mucho menos probable.

Eso es (un poco) mal consejo, ya que puede hacer que el sitio sea inaccesible. Deberías regenerar el ID de sesión cada vez que un usuario privilegios cambios sin embargo. En general, eso significa que cada vez que inician sesión. Esto es para evitar la fijación de sesión (una forma de secuestro de sesión). Consulte este reciente hilo @ Sitepoint para obtener más información sobre el tema.

Usar sesiones basadas en cookies solamente está bien, pero si regeneras las ID de sesión al iniciar sesión, no agrega ninguna seguridad adicional y reduce un poco la accesibilidad.

0
agregado
Mira de cerca. Vuelva a generar el id de sesión-id, pero solo cuando lo necesite. Eso significa cuando el usuario inicia sesión.
agregado el autor troelskn, fuente
He ido a ese foro de sitio y he echado un vistazo. por lo que puedo ver, en realidad parecen recomendar la regeneración de ID, así como el uso de cookies solo en general.
agregado el autor Laith, fuente
no todos en el hilo están de acuerdo con esa postura
agregado el autor Laith, fuente

Encapsule la matriz $ SESSION en un Objeto Session() que le permite obtener variables de sesión, get y post con una forma similar (pero disociable), que incluye filtros de seguridad automáticos, variables flash (var que se usan una vez que se destruyen), y establecedores de valores predeterminados.

Eche un vistazo al comportamiento de Symfony en ese punto, es muy útil.

0
agregado

En primer lugar, utilice cookies basadas solo a menos que tenga una buena razón comercial específica para no hacerlo. Tenía un cliente que insistía en las sesiones basadas en url solo para un proyecto. muy inseguro y un dolor para trabajar.

Una buena idea es regenerar la sesión en cada solicitud. esto hace que el secuestro sea mucho menos probable. Por ejemplo.

session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();

Otra buena práctica es que si está realizando algún tipo de inicio de sesión de usuario como parte del sistema, invalide y vacíe por completo los datos de la sesión en un cierre de sesión para asegurarse de que el usuario haya cerrado la sesión del sistema. He visto sistemas en los que el cierre de sesión solo se logra eliminando la cookie de sesión.

0
agregado

En cuanto a la simplicidad, no hay nada mejor que:

# Start the session manager
session_start(); 

# Set a var
$_SESSION['foo'] = 'whatever';

# Access the var
print $_SESSION['foo'];
0
agregado

Puede almacenar sesiones PHP en la base de datos, como se describe en esto   libro. He usado este método y me resulta seguro y fácil de implementar, así que lo recomendaría.

0
agregado

Si bien la base de datos puede ser más segura para las sesiones, primero debe centrarse en lo que está almacenando en la sesión; en realidad, no debe contener nada más que una identificación para identificar al usuario (y QUIZÁ un nombre o una variable temporal entre páginas )

Sugeriría simplemente usar las cookies predeterminadas. Las sesiones de la base de datos dan un golpe adicional EN CADA PÁGINA, y aunque no todos los sitios son una barra diagonal, no hay nada de malo en preoptizar algo tan simple como esto.

Para el uso, recomendaría la variable global estándar:

$_SESSION['yourvar'] = 'somevalue';

Si usa ese método en todo su código, puede cambiarlo fácilmente más tarde mediante el uso de session_set_save_handler , que ofrece una forma unificada de implementar backends de sesión. Tenga en cuenta que puede usar un objeto para contener todo el manejo de la sesión, simplemente dele arreglos a cada entrada - array ('Staticclass', 'staticmethod').

Para un uso más profundo, le recomendaría que consulte cómo se manejan las sesiones en KohanaPHP .

0
agregado