2010-04-07 25 views
22

A veces, me encuentro con ciertos marcos de desarrollo web que no proporcionan una característica de autenticación, como en Authentication ASP.NET.Mejores prácticas para implementar Secure "Remember Me"

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. almacenar el nombre de usuario en la galleta. El nombre de usuario no está encriptado.

  2. Almacenar 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. Utilice HttpOnly en las cookies. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

Cualquier otra cosa me he perdido, lo que podría dar lugar a agujeros de seguridad?

Respuesta

17

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 y gestión de sesión rotas" en el OWASP top 10 for 2010. Un punto importante en esta sección es que https se debe usar para la sesión completa . 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 método más sencillo (y seguro) para implementar un "recuérdame" función sería la de modificar el tiempo de espera de sesión de 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 o asi que. 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.

+3

Gran respuesta. Lo único que agregaré es tomar precauciones para evitar XSS y CSRF. Ambos problemas se vuelven importantes si tienes sesiones de larga duración. –

+0

@Srim Estoy totalmente de acuerdo contigo. (+1) – rook

Cuestiones relacionadas