security - recaptcha
La mejor manera de limitar(y registrar) los intentos de inicio de sesiĆ³n (8)
Almacenar intentos en la base de datos es la mejor solución en mi humilde opinión, ya que le proporciona los registros de auditoría de los intentos de violación de seguridad. Dependiendo de su aplicación, esto puede o no ser un requisito legal.
Al registrar todos los intentos fallidos también puede reunir información de nivel superior, como si las solicitudes provienen de una dirección IP (es decir, alguien / cosa está intentando un ataque de fuerza bruta) para que pueda bloquear la dirección IP. Esta puede ser información MUY útil.
Una vez que haya determinado un umbral, ¿por qué no obligarlos a solicitar que se envíe el correo electrónico a su dirección de correo electrónico (es decir, similar a ''He olvidado mi contraseña''), o puede optar por el enfoque CAPCHA.
Obviamente, algún tipo de mecanismo para limitar los intentos de inicio de sesión es un requisito de seguridad. Aunque me gusta el concepto de un aumento exponencial del tiempo entre intentos, no estoy seguro de almacenar la información. También estoy interesado en soluciones alternativas, preferiblemente sin incluir captchas.
Supongo que una cookie no funcionaría debido a que bloqueaba las cookies o las borraba automáticamente, pero ¿funcionarían las sesiones? ¿O tiene que ser almacenado en una base de datos? No estoy al tanto de qué métodos se pueden usar, así que simplemente no sé qué es práctico.
Almacene la información del lado del servidor. Esto le permitiría también defenderse contra ataques distribuidos (provenientes de múltiples máquinas).
Asumiendo que Google ha hecho las pruebas de usabilidad necesarias (no es una suposición injusta) y decidió usar captchas, le sugiero que las acompañe.
Aumentar los tiempos de espera es frustrante cuando soy un usuario genuino y he olvidado mi contraseña (con tantos sitios web y sus contraseñas asociadas que suceden mucho, especialmente para mí)
Puede querer bloquear el inicio de sesión por algún tiempo, por ejemplo, 10 minutos después de 3 intentos fallidos, por ejemplo. El tiempo que aumenta exponencialmente me suena bien. Y sí, almacene la información en la sesión o base de datos del servidor. La base de datos es mejor. No hay negocio de cookies, ya que es fácil de manipular por parte del usuario.
También es posible que desee asignar dichos intentos a la dirección IP del cliente, ya que es muy posible que un usuario válido reciba un mensaje bloqueado mientras otra persona intenta adivinar la contraseña válida del usuario con intentos de falla.
Sabes qué ID de usuario está siendo golpeado, mantén una bandera y cuando alcanza un valor de umbral simplemente deja de aceptar cualquier cosa para ese usuario. Pero eso significa que almacena un valor de datos adicional para cada usuario.
Me gusta el concepto de un tiempo exponencialmente creciente entre intentos, [...]
En lugar de utilizar el tiempo exponencialmente creciente, en realidad podría tener un retraso aleatorizado entre intentos sucesivos.
Tal vez, si explicas qué tecnología estás utilizando, las personas aquí podrán ayudarte con ejemplos más específicos.
Use algunas columnas en su tabla de usuarios ''failed_login_attempts'' y ''failed_login_time''. El primero se incrementa por cada inicio de sesión fallido y se restablece al iniciar sesión correctamente. El segundo te permite comparar la hora actual con el último tiempo fallido.
Su código puede usar estos datos en el archivo db para determinar cuánto tiempo espera para bloquear a los usuarios, el tiempo entre los inicios de sesión permitidos, etc.
La política de bloqueo está bien pero hay un equilibrio.
Una consideración es pensar en la construcción de nombres de usuario, ¿imaginable? ¿Pueden ser enumerados en absoluto?
Estaba en una Prueba de lápiz de aplicación externa para un puntocom con un Portal de empleado que servía Servicios de acceso web / Intranet de Outlook, ciertas aplicaciones. Fue fácil enumerar a los usuarios (el equipo ejecutivo / de gestión en el sitio web mismo, y a través de los gustos de Google, Facebook, LinkedIn, etc.). Una vez que obtuviste el formato de inicio de sesión con el nombre de usuario (firstname luego el apellido ingresado como una sola cadena) tuve la capacidad de cerrar 100 de usuarios debido a su política de 3 strikes and out.
Las respuestas en esta publicación priorizan las soluciones centradas en la base de datos porque proporcionan una estructura de registros que hacen que la auditoría y la lógica de bloqueo sean convenientes.
Si bien las respuestas aquí abordan los ataques de adivinación a usuarios individuales, una de las principales preocupaciones con este enfoque es que deja el sistema abierto a ataques de denegación de servicio . Todas y cada una de las solicitudes del mundo no deberían activar el trabajo de la base de datos.
Una capa de seguridad alternativa (o adicional) debería implementarse antes en el ciclo de req / res para proteger la aplicación y la base de datos de realizar operaciones de bloqueo que pueden ser costosas y no son necesarias.
Express-Brute es un excelente ejemplo que utiliza el almacenamiento en caché de Redis para filtrar las solicitudes maliciosas y, al mismo tiempo, permite las honestas.