¿Este enfoque de protección de cookies es seguro?

1

No pude encontrar reseñas sobre cookies seguras, así que he pensado un poco. (Ya tengo una base de datos de contraseñas "segura" con bcrypt y salt)

Pasos:

  1. El usuario inicia sesión
  2. Guardar el usuario + la cadena aleatoria en el ejemplo de memcache ( key = IP value + randomstring + username )
  3. Crear una nueva cadena username + ip
  4. Cifre esta cadena con blowfish, la clave de cifrado será la cadena aleatoria almacenada en el memcache
  5. El usuario recibe una cookie cifrada
  6. Si el usuario vuelve a mi sitio y tiene una cookie - > Verifico si su IP está en el memcache, si es así, tome el valor que es randomstring & nombre de usuario
  7. Intente descifrar el valor de la cookie con la cadena aleatoria
  8. Verifique si la IP de solicitud y la IP almacenadas en la cookie son iguales y los nombres de usuario son iguales. (nombre de usuario de cookie vs nombre de usuario de memcache)
  9. Si tiene éxito, inicie sesión

¿Qué piensas?

Ahora hay dos cosas de las que me preocupo:

  1. ¿Se pueden falsificar las solicitudes de IP?
  2. ¿Es seguro mi memcache?
pregunta Maik Klein 11.07.2012 - 13:05
fuente

3 respuestas

3

La respuesta corta. Tu mecanismo es demasiado complicado. Existe una solución más simple, mejor y más segura: use SSL en todo el sitio y configure el bit secure en todas sus cookies para que solo se envíen a través de conexiones cifradas (SSL).

Aspecto técnico esencial. Si realmente desea discutir su mecanismo propuesto, podemos hablar de ello, pero creo que las deficiencias técnicas específicas son secundarias al punto más general de que hay un Más simple, mejor manera de hacerlo. Aquí hay algunos detalles:

Si corrige estos defectos, su propuesta no es del todo irrazonable. Por ejemplo, ASP.NET admite el cifrado y la autenticación de cookies utilizando un MachineKey.

Sin embargo, no te recomiendo que tomes este camino. Si bien es probable que pueda solucionar estos fallos dado un gran esfuerzo, sospecho que la complejidad de inventar cómo hacerlo correctamente es probablemente más de lo que está calificado. Esto es algo complicado, y sería fácil hacer algo mal. (Por ejemplo, presencie las fallas devastadoras en el cifrado de ASP.NET, lo que permitió que los ataques oraculares de relleno para descifrar todo y anular la seguridad de todo el cifrado).

Consejo general. En lugar de intentar hacer algo raro con el cifrado de sus cookies, le sugiero el siguiente consejo:

  • En términos generales, sea reacio a almacenar el estado en cookies. En su lugar, guárdelo en la sesión o en la base de datos. De esa manera, todo lo que necesita es una cookie de sesión.

  • Use el soporte de administración de sesión integrado en su marco de programación web; no trates de rodar el tuyo (Si intentas rodar el tuyo, puedes terminar fácilmente con vulnerabilidades como la fijación de la sesión).

  • Use SSL en todo el sitio. Establezca el indicador secure en todas las cookies.

  • Utilice la defensa CSRF para todas las solicitudes POST. Asegúrese de que todas las solicitudes GET no tengan efectos secundarios (las solicitudes de efectos secundarios deben enviarse como POST).

  • Lea los materiales de OWASP sobre seguridad de aplicaciones web.

respondido por el D.W. 16.07.2012 - 04:51
fuente
4

¿Por qué demonios quiere almacenar credenciales (incluso cifradas) en el lado del cliente? La mejor idea es mantener todo en sesiones.

Además, si desea pensar en la seguridad de las cookies, no puede olvidarse de los indicadores como: Secure y HttpOnly .

HttpOnly : este nos protege de cualquier tipo de vulnerabilidad de XSS. Esto significa que no se puede acceder a la cookie con esta bandera a través del script del lado del cliente (por supuesto, solo funciona para los navegadores que admiten esta bandera, en la actualidad, casi todas).

Seguro : esta bandera "obliga" al navegador a usar cookies solo cuando se establece una conexión segura / encriptada.

    
respondido por el p____h 11.07.2012 - 13:16
fuente
2

La solución general que utilizo para proteger las cookies y las páginas son

  • Use HTTPS para inicios de sesión y páginas privadas como PMs (o tenga el https del sitio completo)
  • Envíe de vuelta una cookie segura y solo HTTP con un token de "inicio de sesión" o "auth" (verificamos si coincide con el usuario). Este token se usa para páginas privadas como PMs.
  • Envíe de nuevo otro token de inicio de sesión / autenticación que sea http solo pero no seguro para que pueda usarse para páginas que no sean https (esto es opcional. Pero si le gusta mostrar el nombre de usuario, los mensajes o permitir que un usuario publique comentarios públicos, tiene) para ser una forma de autentificarlos, por lo que puede ser necesario si desea que se encuentre en páginas que no sean https)
  • Use una cookie WantHttp, de modo que si un usuario hace clic en un enlace a una versión no http del sitio, se lo redirigirá automáticamente a la versión https
  • Tenga un token CSRF que usan todos los formularios en cada página. Seleccionado al azar pero no igual en todos los usuarios (no constante)
  • Tener ese mismo token CSRF como una cookie solo HTTP. Cada vez que se realiza una solicitud POST, verifique el formulario y la cookie para ver si coinciden. No se requiere búsqueda en la base de datos (solo observe los valores de las cookies y los formularios). Si no coinciden, un atacante está intentando enviar automáticamente una solicitud en nombre de los usuarios. Los atacantes no pueden saber qué es el token de los usuarios, ya que no pueden solicitar páginas ni leerlas. No pueden ver la cookie httponly con js. Pueden solicitar un http página mientras busca paquetes y lea sus cookies. En ese caso, siempre use https en cada página con un formulario y marque la cookie de token como segura.
respondido por el user5575 11.07.2012 - 14:02
fuente

Lea otras preguntas en las etiquetas