2012-03-02 18 views
6

Estaba pensando en escribir mi propio script de autenticación, pero no sé mucho sobre seguridad.¿Qué debo usar para la autenticación de usuario en PHP?

De los artículos que he leído, parece que generalmente implica el hash de la contraseña con un salt y la almacena en la base de datos. Luego, cuando el usuario solicita iniciar sesión, la contraseña se codifica y se compara con la base de datos. Si coincide, los datos del usuario se almacenan en $ _SESSION.

Sin embargo, no sé si esto es seguro o no. Leí algo sobre el almacenamiento de claves de sesión en la base de datos, pero no estoy seguro de cómo funciona eso o cómo implementarlo.

¿Alguien puede explicar cómo implementar la autenticación segura?

Además, ¿hay alguna sugerencia para las bibliotecas de autenticación de PHP que puedo incorporar que sean fáciles de aprender en lugar de escribir la mía?

+2

Lea este excelente resumen primero: [hash seguro y sal para contraseñas php] (http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) –

+1

Debe volver -utilizar un marco de autenticación existente siempre que sea posible, porque, en realidad, es complejo. Por ejemplo, eche un vistazo a https://github.com/delight-im/PHP-Auth, que es tanto agnóstico como independiente de la base de datos. – caw

Respuesta

5

Verificar this answer here.

Aunque la respuesta es de 3 años, la biblioteca phpass sugerida está actualizada.

Además, +1 a Aron Cederholm. La seguridad de contraseñas es un tema extenso y primero debe consultar las preguntas relacionadas que ya se discutieron aquí en StackOverflow para que esté más familiarizado con el tema y las mejores prácticas en materia de seguridad.

Aunque me gustan los marcos (Symfony, Zend, etc.) ya que generalmente implementan estas buenas prácticas, el solo hecho de utilizarlas no lo convierte en un buen programador. Tienes que aprender su funcionamiento interno. Siempre saludo a un programador que se esfuerza por codificar su propio mecanismo de autenticación segura (siempre y cuando no lo implementen en un sitio en vivo que realmente necesita una gran seguridad), porque esa es la mejor manera de aprender y comprender los principios del tema. Siempre comience desde una implementación existente, y ENTONCES use eso como ejemplo para crear su propia base de código.

+0

Zend en realidad tiene un módulo Auth horrible que viene con ejemplos inseguros. – Jacco

5

Cosas a tener en cuenta:

  1. autenticación; verificar que el usuario es quien dicen ser.
  2. Autorización; asegurando que el usuario tenga permitido hacer lo que está intentando.
  3. Contabilidad; grabando y auditando lo que hacen.

Para la autenticación, deberá realizar un seguimiento de los "usuarios" conectados y (a menudo) autenticados con el sistema. Esto requiere conocer un identificador (un nombre de usuario, correo electrónico o algún otro token único) y una frase de contraseña. Almacene el nombre de usuario y la frase de contraseña en algún lugar, pero nunca almacene la contraseña sin asegurarla primero: no use un algoritmo de resumen de mensaje (como MD5 o SHA1) con un salt. Use bcrypt en su lugar. Aunque no es una mala idea utilizar un marco aquí, no siempre confíes en un marco para hacer lo correcto.

Para obtener autorización, deberá realizar un seguimiento de las acciones que realiza el usuario y realizar comprobaciones de permisos para ver si se le permite realizar la acción que está intentando. Esto se puede lograr de varias maneras diferentes y todas ellas son específicas del dominio; a menudo no encontrará un ejemplo sencillo, aunque puede encontrar muchos marcos que lo ayuden.

Para la contabilidad, debe registrar las acciones que realiza el usuario. Esta es la parte más olvidada de cualquier aplicación, pero cuando suceden cosas malas, es absolutamente crucial tenerla y reconstruirla a partir de los registros de acceso del servidor web. Es una pesadilla. Nuevamente, esto es específico del dominio pero un buen marco debería facilitar la implementación del mismo.

Por último, vincular los tres elementos es la sesión de su usuario. Cuando llama a 'session_start()' en PHP, envía un identificador de sesión como una cookie al cliente y almacena un archivo en el disco duro del servidor que contiene los contenidos de $_SESSION para ese usuario. También puede configurar PHP para anular la funcionalidad predeterminada y guardar los datos de la sesión usando session_set_save_handler. Luego puede almacenar esa información en la base de datos.

TL; DR: Utilice un marco como CodeIgniter, Drupal, Yii u otra solución desarrollada activamente. La gran mayoría de los marcos que existen harán todo lo que necesiten, y si no lo hacen, pueden modificarse muy fácilmente. No cree su propio marco para esto; use uno que ya esté disponible.

1

Uso tank_auth (un complemento Codeigniter) que es bastante bueno. El código fuente es una buena referencia de cómo implementar un inicio de sesión seguro.

Cuestiones relacionadas