net mvc asp and asp.net security

asp.net - authentication and authorization in asp net mvc 5



La mejor práctica para implementar Secure "Remember Me" (1)

A veces, me encuentro con ciertos marcos de desarrollo web que no proporcionan una función de autenticación, como en Authentication ASP.NET.

Me preguntaba qué medidas de seguridad deben tenerse en cuenta al implementar las características de inicio de sesión "Recordarme", mediante codificación manual.

Estas son las cosas que suelo hacer:

  1. Almacene el nombre de usuario en la cookie. El nombre de usuario no está encriptado.

  2. Almacene una clave secreta en una cookie. La clave secreta se genera utilizando la función de una sola dirección en función del nombre de usuario. El servidor verificará la clave secreta contra el nombre de usuario, para garantizar que este nombre de usuario no se modifique.

  3. Use HttpOnly en una cookie. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

¿Algo más que haya echado de menos, que podría conducir a agujeros de seguridad?


La cookie siempre debe ser un valor aleatorio que caduque. Hay casos en los que puede almacenar el estado como un valor de cookie y no constituye un peligro grave, como el idioma preferido por los usuarios, pero esto debe evitarse tanto como sea posible. Activar HttpOnlyCookies, es una gran idea.

Lea A3: "Autenticación rota y gestión de sesiones" en el top 10 de OWASP para 2010 . Un punto importante en esta sección es que https debe usarse para toda la sesión . Si la sesión dura mucho tiempo, esto es aún más importante.

También tenga en cuenta que "Recordarme" crea una gran ventana en la que un atacante puede "montar" en la sesión. Esto le da al atacante un tiempo muy largo (¿Meses?) En el cual puede lanzar un ataque CSRF. Incluso si tiene protección CSRF, un atacante aún puede viajar en una sesión con XSS y XmlHttpRequest (HttpOnlyCookies evitará un secuestro completo). "Remember Me" hace otras amenazas como xss, csrf, oler más serio. Mientras se hayan solucionado estas vulnerabilidades, no deberías tener un problema con los hackers del mundo real.

El enfoque más sencillo (y seguro) para implementar la función "recordarme" sería modificar el tiempo de espera de la sesión en su archivo web.config:

<configuration> <system.web> <sessionState timeout="60"/> </sessionState> </system.web> </configuration>

Se el tiempo de espera a algo alto, tal vez un mes más o menos. Si la casilla "Recordarme" está desmarcada, guarde una variable de sesión de un tiempo de espera más normal (como 24 horas). Compruebe esta variable de sesión en un archivo de encabezado para cada solicitud. Si la casilla de verificación está marcada, actúe normalmente y deje que asp.net se encargue de ello.

Si la sesión no expira, será mucho más fácil usar la fuerza bruta. Estos valores son grandes, pero permitir que un hacker pase años tratando de adivinar una identificación de sesión es una vulnerabilidad.