Estoy de acuerdo con Carlos sobre la falta de un sistema seguro "perfecto", no solo para iniciar sesión, sino para cualquier otro componente.Lo único que se debe hacer es minimizar los riesgos siguiendo las mejores prácticas, pero siempre teniendo en cuenta que la seguridad total no existe, por lo que su pregunta es bastante difícil de responder, aunque hay algunos buenos ejemplos, there, nada es perfecto, la seguridad es un tema que evoluciona muy rápido.
Para mí las cosas principales a resolver son:
transmisión -Datos: El usuario siempre va a escribir una contraseña y esto tiene que ser enviado a su sistema antes de que fuera procesado, por lo que hay una alto riesgo de ser interceptado si está usando un canal abierto. Para resolver esto, DEBE usar transportar los datos a través de un canal encriptado (SSL), de ninguna otra manera a menos que suelte la contraseña común (por ejemplo, usar tokens de uso único o delegar la autenticación a un tercero, como Facebook connect o openId) Ver "How to Make a Secure Login Form with SSL"
Saneamiento -Entrada: Para evitar XSS y SQL Injection consideran que cualquier entrada que proviene de un cliente como un punto de riesgo potencial, por lo tanto, usted tiene que realizar la validación contra todo lo que viene fuera ->doc. Otro good practice nunca usa las entradas directamente en las consultas, úselas como variables de vinculación en las declaraciones preparadas o los procedimientos almacenados.
-Password almacenamiento: contraseña debe estar siempre almacena encriptada con un algoritmo de cifrado unidireccional, por lo que incluso en el caso de una persona para acceder a su base de datos, no hay manera de recuperar las contraseñas originales. También use técnicas como Salting, Hashing varias veces, etc. También tenga cuidado de elegir un algoritmo que no sea débil o desactualizado (como MD5), que puede romperse fácilmente mediante la fuerza bruta con la potencia creciente de la CPU.
-Infrastructure: Haga que sus máquinas, sistema operativo, marcos, bibliotecas siempre se actualicen para evitar errores y 0 días de ataque. Cualquier sistema de hoy es enormemente complejo, y el sistema es tan seguro como su componente más débil.
-Otros aspectos a tener en cuenta: Revise su política de seguridad regularmente para ver si necesita actualizar algo, implementar políticas de contraseñas (vencimiento, reutilización, etc.), acceder a registros, usar herramientas de monitoreo para sus sistemas, etc. etc etc
Y después de todo eso, puede estar seguro de que si alguien tiene suficiente tiempo y recursos, su sistema se caerá.
+1 para mucha información útil. Todavía estoy sorprendido de que nadie pueda proporcionar un tutorial que lo haga todo bien y en el que se pueda construir una aplicación más compleja. Supongo que esto es parte de la razón por la que tantos sitios web tienen tantos agujeros de seguridad, incluso cuando son administrados por compañías multimillonarias. –
Acepto que no es fácil encontrar una buena respuesta, pero creo que es porque el tema es bastante complejo, depende en gran medida del idioma/plataforma/tecnología/arquitectura utilizada. Además, no hay una respuesta definitiva, solo puedes seguir buenas prácticas. Pero si todavía necesita algo específico, pruebe esta guía de desarrollo web creada por OWASP: http://puzzle.dl.sourceforge.net/project/owasp/Guide/2.0.1/OWASPGuide2.0.1.pdf – jasalguero