validar validación usuarios usuario usando sistema sesiones seguro primera parte para múltiples crear control contraseña completo como codigo autentificación autenticación administrador php login authentication

usando - validación o autenticación de usuarios en php(primera parte)



¿Cuál es la mejor manera de hacer autenticación de usuario en php? (6)

Simplemente he estado escribiendo 2 cookies, 1 que contiene el ID de usuario y el segundo que contiene 1/2 del hash SH1 de la contraseña (con sal). La forma en que funciona es evidente.

Me di cuenta de que no estaba haciendo esto de la manera más segura. ¿Cuál es una mejor manera de hacer esto? Preferiblemente utilizando una sola cookie de autenticación.

Además, ¿hay algún punto para usar "hashes difíciles de calcular"? Con esto quiero decir, usar bcrypt o hash cada elemento 10,000 veces con hidromasaje, para hacer que sea una función hash (relativamente) lenta (200 ms frente a 1 ms, simplemente SHA1). Quiero decir, si alguien infringe su base de datos y obtiene los hashes ... lo que queda por proteger, ya que todos sus datos están en la misma base de datos (a menos que tenga algún tipo de configuración descentralizada, que no lo hago).


Actualmente, el token único para identificar a un usuario es su nombre de usuario + 1/2 del hash de contraseña con sal. Este token es estático, lo que significa que permanecerá igual en cada solicitud hasta que el usuario cambie su contraseña. Esto significa que si quiero suplantar a un usuario en el sistema solo necesito capturar / interceptar el token una vez. (A menos que esté introduciendo entropía en el token durante la creación del hash almacenado en la cookie). Dado que la mayoría de los usuarios rara vez cambian las contraseñas, un atacante tendrá lo que equivale a un token que no caduca para acceder a una cuenta de usuario.

Una mejor solución es utilizar el mecanismo de sesión de PHP y llamar a session_regenerate_id en cada solicitud para actualizar constantemente el token. Al hacerlo, el secuestro de la sesión es casi imposible, especialmente a través de una conexión SSL con una restricción de rango / dirección IP.

Actualmente hago 0 llamadas DB (excepto durante el inicio de sesión, o cuando algo cambia) para los usuarios registrados. Quería que siguiera siendo así ... - Yegor hace 7 minutos

Los datos de la sesión de PHP se almacenan en el sistema de archivos de manera predeterminada, por lo que no hará llamadas de base de datos adicionales utilizando el mecanismo de sesión incorporado.

Además, ¿hay algún punto para usar "hashes difíciles de calcular"? Con esto quiero decir, usar bcrypt o hash cada elemento 10,000 veces con hidromasaje, para hacer que sea una función hash (relativamente) lenta (200 ms frente a 1 ms, simplemente SHA1).

El hash de una cadena 10.000 veces no hace que sea 10.000 veces más seguro que hacerlo una vez. Hash una vez con un buen cifrado unidireccional como SHA1 o Whirlpool.

Quiero decir, si alguien infringe su base de datos y obtiene los hashes ... lo que queda por proteger, ya que todos sus datos están en la misma base de datos (a menos que tenga algún tipo de configuración descentralizada, que no lo hago).

Los hashes de contraseña de salado los protegen de los ataques de una mesa de arco iris . Actualmente, es muy difícil, si no imposible, descifrar contraseñas con sal con una tabla de arco iris.


Esta es la mejor manera y la más fácil.

paso1 en su página de inicio de sesión / índice ingrese este código

<?php if(check if username and password is correct) { header(''location:home.php''); $_SESSION[''logged'']=true; } else { header(''location:index.php''); } ?>

Paso 2 en tu página que quieres autenticar

<?php if(isset($_SESSION[''logged''])) { ?> your page content here <?php } else { header(''location:index.php''); ?>

paso3 en tu logoutpage

<?php session_start(); session_destroy(); header(''Location:index.php''); ?>

eso es todo


Hay varias maneras de hacer esto. No voy a profundizar demasiado ya que hay mucha literatura sobre el tema.

  • En primer lugar, es mejor usar algo como SHA256 para reducir la posibilidad de colisiones.
  • También debe usar salazón o salado doble con una sal variable (como la propiedad intelectual, para evitar el robo de sesiones). Una cadena de cookies se vería como YOURSALT123.123.123.123USERNAMEPASSWORD antes de ser eliminada.
  • Utilice las sesiones junto con sus propias cookies.
  • Dependiendo de sus requisitos de seguridad, utilice SSL.

Todo depende de qué tan seguro necesita estar. Un sitio web comunitario sobre lolcats tiene diferentes requisitos de seguridad en comparación con un sitio web bancario.


Pregúntese qué tan estrictos son sus requisitos de seguridad para determinar qué tan difícil será o no. Yo uso Zend_Auth y Zend_Acl para manejar la autenticación / autorización en mis aplicaciones php. Si actualmente está utilizando un marco, puede buscar las mejores prácticas recomendadas. Incluso si no está utilizando un marco, puede buscar otros sitios / aplicaciones para familiarizarse con él. Sin embargo, hay mucho más que eso cuando se trata de usar https para sesiones de inicio de sesión / inicio de sesión completo, cookies solo de http, etc.


Si desea implementar una funcionalidad de "recordarme" para su sitio, es aceptable almacenar el ID de usuario en una cookie.

No debe almacenar la contraseña en la cookie del usuario. Si lo desean, pueden guardar esto en su navegador.


utilizar Sessions . Almacene el identificador de sesión en la cookie y almacene el estado del usuario en el lado del servidor (login, ID de usuario, IP).

Para aclarar lo que necesita almacenar en la matriz de sesión:

  • loginIn: una variable booleana acerca de si el usuario ha iniciado sesión o no. Reutiliza la misma cookie para varias sesiones, por lo que recuerda el nombre de usuario de los usuarios la próxima vez que visiten su sitio, etc.
  • ID de usuario : el ID de uniqe del usuario en la base de datos. Use esto para obtener más información sobre el usuario, como nombre de usuario, correo electrónico, etc. Esto también puede mantenerse en la matriz de la sesión después de que el usuario cierre la sesión.
  • IP: para evitar que alguien robe el ID de sesión y lo use, también almacena la IP del usuario. Esto es opcional, ya que a veces desea permitir que el usuario se desplace (por ejemplo, me permite moverme con mi computadora portátil sin desconectarme cuando cambia la IP).
  • lastPing: la marca de tiempo que el usuario fue visto por última vez. Esto se puede utilizar en lugar de la fecha de caducidad de la cookie. Si también almacena la duración de la sesión, puede cerrar la sesión del usuario debido a la inactividad. Esto significa que la cookie de identificación de sesión se puede almacenar en la computadora de los usuarios durante un tiempo muy largo.

Cuando el usuario loggedIn sesión o se desconecta debido a inactividad, simplemente establece loggedIn en falso. Cuando el usuario inicia sesión con el nombre de usuario y la contraseña loggedIn establece loggedIn en verdadero y actualiza los otros campos (ID de usuario, IP, vida útil). Cuando el usuario carga una página, usted lastPing la lastPing con la hora actual y la lifetime , y actualiza la lastPing o lastPing sesión del usuario.

Los datos de la sesión se pueden almacenar en el sistema de archivos o en una base de datos. Si se almacena en una base de datos, userId es una clave externa para el registro del usuario, o todos los datos se pueden colocar en el registro del usuario.

Hash

repetir un valor varias veces no es una buena idea, porque reduce la seguridad . En su lugar, utilice sal, combinando una sal estática (nombre de la página, por ejemplo) y el nombre de usuario del usuario, junto con la contraseña. Un hash que lleva mucho tiempo no es mejor que un hash rápido, un hash que da como resultado un resumen grande es mejor que un hash que produce un resumen corto (debido a la fuerza bruta). El uso de SHA1 debería ser lo suficientemente bueno para un sitio normal (IE, no un banco o una organización militar secreta).