¿Cuál es la forma más actual, de buenas prácticas y más sencilla de utilizar sesiones en PHP?

StackOverflow https://stackoverflow.com/questions/96460

  •  01-07-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

La gestión de sesiones cambió hace algún tiempo (creo que fue alrededor de 4.4).El antiguo mecanismo todavía funciona, pero está en desuso.Es bastante confuso, por lo que recomiendo mantenerse alejado de él.Hoy en día, usas sesiones accediendo a la variable global $_SESSION (Es una matriz).Tú poder coloque instancias de objetos allí, pero debe cargar las definiciones de clase para esos objetos antes de iniciar la sesión en la página siguiente.Usando carga automática puede ayudarte aquí.

Usted debe iniciar una sesión antes de poder usar $_SESSION.Dado que al iniciar la sesión se envían encabezados, no puede tener ningún resultado antes.Esto se puede solucionar de dos maneras:O siempre comienzas la sesión al comienzo de tu guión.O tu buffer toda la salida, y envíelo al final del guión.

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

Ese es un (ligeramente) mal consejo, ya que puede hacer que el sitio sea inaccesible.Debería regenerar el ID de sesión Sin embargo, cada vez que cambian los privilegios de un usuario.En general, eso significa, cada vez que inician sesión.Esto es para evitar la fijación de sesiones (una forma de secuestro de sesiones).Ver este hilo reciente @ Sitepoint para más sobre el tema.

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

Otros consejos

En cuanto a simplicidad, no hay nada mejor que:

# Start the session manager
session_start(); 

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

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

Si bien la base de datos puede ser más segura para las sesiones, en primer lugar debes concentrarte en lo que estás almacenando en la sesión; en realidad no debería contener nada más que una identificación para identificar al usuario (y QUIZÁS un nombre o una variable temporal entre páginas). ).

Sugeriría simplemente usar las cookies predeterminadas.Las sesiones de base de datos dan un toque extra EN CADA PÁGINA, y aunque no todos los sitios tienen barra diagonal, no hay nada de malo en optimizar previamente algo tan simple como esto.

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

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

Si usa ese método en todo su código, puede cambiar fácilmente el back-end más adelante mediante el uso de session_set_save_handler, que proporciona 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 proporcione matrices para cada entrada: matriz ('Staticclass', 'staticmethod').

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

Puede almacenar sesiones PHP en la base de datos, como se describe en estelibro.He utilizado este método y lo encuentro seguro y fácil de implementar, por lo que lo recomendaría.

Encapsule la matriz $SESSION en un objeto Session() que le permita obtener variables de la sesión, obtener y publicar de una manera similar (aunque disociable), incluidos filtros de seguridad automáticos, variables flash (var que se usan una vez y luego se destruyen), y establecedores de valores predeterminados.

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

Las sesiones fueron una parte fundamental de mis conocimientos 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" );
}

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

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 cosa que es una 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 al cerrar sesión para asegurarse de que el usuario realmente haya cerrado sesión en el sistema.He visto sistemas en los que el cierre de sesión se realiza simplemente eliminando la cookie de sesión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top