2011-05-26 15 views
5

Hay muchas maneras de crear un formulario de inicio de sesión para aplicaciones web y la mayoría de ellos son defectuosos de una manera u otra:ejemplo de acceso web seguro/tutorial

  • las contraseñas se transmiten/guardados como texto
  • Los cuadros de diálogo de inicio de sesión
  • están sujetos a ataques XSS o SQL inyección

¿hay un ejemplo o un tutorial de cómo crear un formulario de acceso seguro?

Respuesta

8

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á.

+0

+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. –

+1

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

3

su pregunta, no puede ser tan agnóstico, y debe ser dividida en sus dos preocupaciones principales:

Transmisión de contraseñas en la clara. Xss, inyección Sql.

Ningún sistema será declarado seguro per se, pero puede hacer su mejor esfuerzo para minimizar los riesgos mediante el uso de conceptos probados.

Digamos que tiene la posibilidad de diseñar su propio "sistema seguro", ¿qué necesita?

Como mínimo se necesita un conjunto básico de herramientas:

Client side data encripting: (Javascript here, i think you will find lots of info of how to send your data in data 64 or something like that, remember you are searching for one way or two way encription) 

DB Encription: (One way-two way encription, but never save passwords in the clear) 

SQl injection: (mysql_real_escape_string() comes to mind). 

Cada idioma tiene algún tipo de protección incorporado, que es cuando la construcción de grandes proyectos que a veces es posible que se olvide de desinfectar algunos querys

repito ningún sistema volverá a ser declarada segura, sin embargo se puede añadir algunas otras medidas de seguridad como en:

  • access_tokens = cronometrados-secuencias que permiten validar el uso r iniciar sesión
  • captcha_after_few_intents = debe agregar esto definitivamente.
  • block_account_after_few_trys = dolor en el * para los usuarios, pero definitivamente lo vale.
  • login_token = tienda de un símbolo único para ese usuario, y utilizarlo en todas GET/transacciones de POST
  • SSL

De Banco de Previsión:

  • Máquinas automáticas de GSM que genera RANDS y access_tokens válido solo por un corto tiempo.
  • ratón del teclado: evitates keyloggers
  • random_access_question:
  • check_random_account_country_change = digamos usuario es de Albany y al día siguiente se inicia la sesión de América del Sur, que debería aumentar tal vez una bandera para su sistema.

Estoy seguro de que encontrará un montón de consejos en alguna parte, pero recuerdo que al final terminará html hablando, y algunos js, su principal defensa es en el lado del servidor, así que sea buena, o ser bueno en eso .

+0

Estoy de acuerdo con sus comentarios generales, pero ¿eso significa que no hay un solo tutorial que explique cómo hacerlo bien? Hay tantas cosas que uno puede hacer mal, es fácil perderse algo obvio. –

Cuestiones relacionadas