cómo crear un sistema de acceso seguro php, lo que permite “No cerrar sesión” funcionalidad?

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

Pregunta

Yo uso un sistema de acceso sencillo basado en Vars sesión. Una vez que el usuario inicia sesión, una sesión var esta definida que le dice a mi guión el usuario debe ser aceptado. Yo no uso ninguna cookie de var encargo del lado del cliente.

Me gustaría ofrecer la opción en la pantalla de inicio de sesión que dice "Keep me loggued en todo el día". ¿Cómo se hace eso de una manera segura?

¿Fue útil?

Solución

Primero: Configurar el session.cookie_lifetime Directiva , ya sea en php.ini, archivos de configuración, o por medio de session_set_cookie_params() .

A continuación, almacenar el nombre de usuario y el valor hash de la contraseña en la sesión, y validar ese inicio de sesión en cada página. Mientras que sigue siendo válida, que puede permanecer conectado.

expiración natural de la cookie de sesión en general, debe mantener las cosas ordenadas, ya que no tienen a nadie cuenta se cierra en medio de la sesión (si las estrellas se alinearon para ello, por supuesto) si lo mantienen activo. De no ser así, sin embargo, me gustaría considerar la solución de eCartoth un cercano segundo lugar, ya que sólo podría añadir una segunda línea a la sentencia if:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

Edit: Una cosa es posible que desee considerar es la fijación de sesión y / o secuestro de sesión. Con el fin de evitar que, me gustaría recomendar uno (o ambos) de dos soluciones:

  1. almacenar la dirección IP del usuario en la sesión
  2. session_regenerate_id() después de cada intento de inicio de sesión correcto.

Otros consejos

Cuando se dice "Seguir conectado todo el día", estoy suponiendo que quiere decir sólo en esa máquina específica, correcta? Se podría utilizar una tabla de MySQL para retener el momento de inicio de sesión ', o una marca de tiempo de inicio de sesión cuando eso ya no será válida si así lo desean para mantenerse conectado en todo el día. A continuación, añadir un poco de secuencia de comandos para el comienzo de su código que recupera el identificador del usuario que a partir de los VARs de sesión. Comparar la fecha y hora actual de ese usuario almacenados contra los 'ts' última válidos y si es pasado ese tiempo, usted sabe que deben ser registrados a cabo, momento en el que se limpie la sesión y obligar al usuario a conectarse de nuevo. Este método significa que no se registrarán a cabo en realidad hasta que tratar de hacer algo más allá de ese punto, pero va a parecer a ellos. También, en lugar de utilizar una base de datos MySQL que podría también almacenar esos últimos TS válidas en una variable de sesión también.

Así por ejemplo, cuando el usuario inicia sesión por primera vez en la "Seguir conectado todo el día seleccionado":

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

A continuación, cada vez que una página se accede en el sistema:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}

Una opción podría ser la creación de una tabla de MySQL que salva las variables de sesión y los asocia con las direcciones IP y una caducidad, pero no estoy seguro de todos los detalles sobre la forma en que se pondrían en práctica.

El más simple (aunque no recomendado) manera de hacer lo que estás buscando sería establecer un $_COOKIE con el nombre de usuario y contraseña en el ordenador, que su sitio comprobará entonces para cuando el señales de usuario en.

Para mayor seguridad, que sería mejor servido para salvar sólo una cookie un hash MD5 salada de los datos del usuario con el fin de proporcionar un potencial hacker menos información acerca de los datos de la cuenta de usuario. La duración se puede ajustar cuando se establece la cookie; php.net tiene documentación razonablemente completa sobre cómo hacerlo.

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