Cómo recuperar / registrar las contraseñas intentadas desde un inicio de sesión fallido [cerrado]

3

Vi la siguiente pregunta antes: ¿Es legal registrar contraseñas de inicios de sesión fallidos?

Creo que plantea otra pregunta: ¿Cómo registro las intentos fallidos de las contraseñas?

Eso parece muy útil cuando necesito comprobar si alguien está haciendo una ingeniería social para ingresar a la cuenta de otra persona.

    
pregunta vianna77 14.11.2015 - 17:49
fuente

1 respuesta

2

Eso sería increíblemente simple. También puede registrar el valor de la contraseña intentada. Modifique su función de inicio de sesión de alguna manera, dependiendo de su idioma.

Ten en cuenta que este es un pseudo código no probado, pero el concepto funcionará :

  1. Un par de cosas de seguridad:

    private boolean properLength(String u, String p)
    {
         return ((u.length > 3 && u.length <= 12) && (p.length > 8 && p.length <= 30)) ? true : false;
    }
    
    private boolean properFormat(String u, String p)
    {
        return (regex.Valid(u, usernameRegex) && regex.Valid(p, passwordRegex)) ? true : false; 
    }
    
    private String stripBadStuff(String stuff)
    {
        // Just in case or something...
        return EncodingFunction.ToASCII(stuff).regexReplace(badCharacaterRegex, ""); 
    }
    
  2. Y el inicio de sesión:

    public String login(String user, String pass) 
    { 
       if (!loginTriesExceeded) // Currently unhandled for example.
       {
           if ((user != null && pass != null) && properLength(user, pass) && properFormat(user, pass))
           {
                if (!userLoginTriesExceeded)
                {
                    // Strips potential hacker injection attempts. You may want to find another way to log this attempt. You wouldn't want to log this to a database without parameters/bound variables. That's beyond the scope of this answer. Google it.
                    String newUser = stripBadStuff(user);
                    String newPass = stripBadStuff(pass);
    
                   // Would be changing DB.lookup() to return true if valid login is detected. DB.lookup(newUser,newPass) will now be assumed that it tests the plaintext password against the salted hash. 
                    if (DB.lookup(newUser, newPass)) 
                    { 
                        // Prevent injection. This will assume DB.lookup() tests the password against the stored hash.
                        return "Hello " + newUser; 
                    }
                    else 
                    {
                        logInvalidAttempt(newUser, newPass);
                        return "Invalid login.";
                    }
               }
               else
               {
                    return "User login attempts exceeded.";
               }
            }
            else
            {
                return "Invalid login.";
            }
        }
        else
        {
            // Do nothing, or inform the visitor that they've exceeded max global logins based on their IP / cookie 
            return null;
        }
    } 
    

Solo usarías logInvalidAttempt(user, pass); cuando falle. Entonces, en lugar de solo decir "error de inicio de sesión", diría "error de inicio de sesión" y registre el intento, pero tenga cuidado de no implementar fallas de seguridad con esto. Deberá asegurarse de que los datos se ingresen correctamente.

En general, solo la entrada de saneamiento no es la respuesta, pero a veces la agrego como una capa adicional después de que todo lo demás haya terminado, por si acaso. No siempre, solo a veces. El ejemplo aquí es para propósitos de aprendizaje.

Ten en cuenta que tendrás que escribir tu propia función logInvalidAttempt() ; eso es demasiado amplio para esta respuesta.

También puede hacer esto para cualquier Content Management System como joomla , WordPress , Drupal , Django , et al. Son, después de todo, de código abierto. Así que todo lo que necesita hacer es modificar la función de inicio de sesión adecuada.

También debe asegurarse de que no se registren demasiados datos. Tendrás que cortarlo en algún momento.

TLDR :

  1. Modificar la función de inicio de sesión ().
  2. Cuando el usuario intenta iniciar sesión con credenciales no válidas, inicie sesión en algún lugar.
    • Si inicia sesión en una base de datos SQL Server , parametrice sus consultas.
    • Si inicia sesión en una base de datos Oracle , vincule sus variables y use declaraciones preparadas.
    • Si inicia sesión en una base de datos MySQL , use declaraciones preparadas y vincule sus parámetros.
    • Si lo registra en un archivo , o en cualquier base de datos , no le permita insertar demasiados datos. Tienes que cortarlo en algún momento.
  3. Leer registros / base de datos.
respondido por el Mark Buffalo 14.11.2015 - 20:00
fuente

Lea otras preguntas en las etiquetas