2010-01-06 13 views
13

Estoy escribiendo un sistema de inicio de sesión para un sitio web que estoy construyendo.
Aquí está la esencia de cómo estoy implementando el sistema de inicio de sesión:cómo implementar un sistema de inicio de sesión para aplicaciones web?

Tengo dos tablas: usuarios y sesiones.

users: uid | uname | pass 
sessions: sid | uid | ts | ts_expires 

El usuario introduce una combinación de uname/pass.

  • si la combinación es incorrecta, me redirecciona a una página de "mala autenticación".
  • si la combinación es correcta, I:
    • generar un sessionid aleatorio (sid)
    • insertar un registro en sessions asociar que sid con el UID del nombre de usuario suministrado.
    • establece una cookie llamada sid con el valor de sid aleatorio que acaba de insertarse en sessions.

En cada página que necesita el usuario para iniciar sesión en, puedo comprobar:

  • si la cookie se establece
  • si el SID es válida

Así mis preguntas son:

  • ¿Cuáles podrían ser los posibles problemas con este mecanismo?
  • ¿Cómo se debe implementar un buen sistema de inicio de sesión?

PD: No uso SSL secure login yet yet. Así que ese es el único problema que veo, a partir de ahora. Y, oh, uso php y mysql, si eso es relevante.


EDIT: almacenar las contraseñas en texto plano no, sino como un MD5 del nombre de usuario concatenado con la contraseña.

Entonces, pass = MD5($uname.$pass), por así decirlo.

+0

MD5 puede ser vulnerable al agrietamiento por fuerza bruta. Para mayor seguridad, hash muchas veces y con diferentes sales. Salar con nombre de usuario no es una gran idea, ya que es un valor que es conocido por el cracker potencial. –

+0

, entonces dices que debo hacer hash con sal aleatoria y almacenar la sal junto con la unme/pass en la tabla de usuarios, ¿verdad? – jrharshath

+0

correcto. la sal también puede ser de texto plano. – Malfist

Respuesta

18

¡Hash esa contraseña, con una sal! Use un fuerte hash como bcrypt. Si tiene que usar MD5/SHA, use una técnica llamada stretching y hash, es hashes varios miles de veces. Al usuario no le importará si demora un segundo verificar su contraseña en lugar de 1/1000, pero lo hará un cracker de fuerza bruta.

Registre los intentos y evite los intentos de fuerza bruta.

Tenga mucho cuidado con dónde almacena las credenciales del usuario una vez que inicia sesión. No quiere que lo cambien.

¡Y usa SSL!

+1

+1 para intentos de registro – jrharshath

+0

También sugiero que codifique manualmente todos los datos enviados con RSA tanto en el lado del cliente como del servidor para mayor seguridad. Nunca sabes para qué ese hacker podría usar tus estadísticas de artículos de WoW. –

1

En general, es una buena práctica almacenar la contraseña como un hash unidireccional salado de la contraseña real en lugar de almacenarla como texto sin formato. No ha declarado si lo hace o no, pero si no lo hace, hágalo.

Asegúrese de que el inicio de sesión tiene un período de tiempo de espera, por lo que no durará para siempre.

Asegúrese de que la cookie se elimine al cerrar la sesión.

No olvide que el usuario puede iniciar sesión desde una computadora pública y que el almacenamiento de credenciales de inicio de sesión como una cookie podría dar como resultado que un usuario posterior obtenga acceso a través de una sesión abandonada.

+1

w.r.t el último punto (computadora pública): Solo puedo advertir al usuario que no use la función "recordarme" en una computadora pública, ¿verdad? Podría intentar unir el sessionid a una dirección IP particular para que el sid mismo no pueda ser robado ni utilizado de manera incorrecta. – jrharshath

+0

No hay mucho que pueda hacer para proteger al usuario cuando está iniciando sesión desde una computadora pública, aparte de enfatizar la necesidad de desconectarse explícitamente de la aplicación cuando hayan terminado y de que el tiempo de espera de la sesión sea muy breve. Ciertamente, también desearía desactivar cualquier función de "recordarme". –

3

Para ralentizar un ataque de fuerza bruta, ejecute un retraso forzado después de un intento fallido; es decir, si alguien le da una contraseña incorrecta, espere tres segundos antes de mostrar la siguiente pantalla con "contraseña fallida".

+0

¿Eso ralentizará potencialmente mi sitio web? – jrharshath

+2

No realmente. No si es un sueño. No consumirá ciclos de reloj, solo retrasará la carga de la página web para esa persona. – Malfist

3

Diseñar e implementar un sistema de inicio de sesión seguro, robusto y utilizable es bastante difícil de conseguir desde el primer intento. Se han escrito páginas sobre páginas sobre este tema, demasiado extensas para tratarlas adecuadamente, aquí.

Un buen punto de partida es www.owasp.org. Luego, contrate a alguien con quien trabaje que tenga conocimientos sobre seguridad, contrate a una empresa de seguridad (como www.matasano.com, veracode.com o neohapsis.com). He trabajado con los tres y los tres son muy buenos. y/o hacer preguntas sobre listas de correo de seguridad (como la lista de seguridad de aplicaciones web que se encuentra en securityfocus.com).

+0

Muy difícil, de acuerdo. Es casi imposible pensar y dar cuenta de todas las contingencias. –

Cuestiones relacionadas