Cómo bloquear los intentos de inicio de sesión con SQL

0

No quiero que el servidor se vea forzado por el servidor, pero no quiero usar un CAPTCHA ya que no son fáciles de usar / No quiero depender de otra compañía, porque no voy a Implementar mi propio sistema de captcha.

He pensado en crear una tabla attempts con esta estructura:

________________________________________________________________
|         IP         |      ATTEMPTS      |        LOCK        |
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
|       1.1.1.1      |         0          |          2         |
|        ....        |        ....        |        ....        |
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾          Yes I had fun making this

Y deje que el usuario haga 5-10 intentos, antes de restablecer a 0 y aumentando el tiempo de bloqueo en un factor de 2, es en minutos.

¿Es este un buen método para bloquear una fuerza bruta?

Tendría una lógica como esta en mi servidor: - abstraída

....
* on request to server do below  *

db.query("SELECT * FROM attempts WHERE IP= *REQUEST.IP* ",function(result){
    if (result.rows.length > 0 && result.rows[0].attempts > 5) {
        if (CheckIfExpired(results.rows[0].lock)) {
            if (loginFail) MultplyLockBy2();
            else RemoveFromAttemptsTable();
        } else res.status("403").send("You're locked out");
    } else normalLoginAttempt().ifFal(add1toAttempts());
....

Tengo la sensación de que hay una forma más eficiente de hacerlo de forma nativa en SQL, soy un principiante con SQL. (Estoy usando postgresql).

Después de ver esto, supongo que también necesitaré un campo de tiempo de inicio, para poder calcular cuándo ha expirado el bloqueo.

EDITAR: después de investigar, he leído / estoy pensando en implementar fail2ban, que verifica los registros de Apache / nginx y bloquea a los usuarios; una cookie que permite a un usuario conectarse de nuevo a su cuenta sin Captcha / prueba de trabajo, y luego hacer que otros obtengan captcha; o simplemente un captcha junto con un bloqueo;

    
pregunta Tobiq 09.10.2016 - 05:23
fuente

2 respuestas

1

Hay algunos problemas que veo con tu enfoque.

En primer lugar, proporciona una ruta hacia un ataque de denegación de servicio; alguien solo necesita seguir suministrando contraseñas malas desde una dirección IP para bloquearla. Asumir una correlación 1: 1 entre los usuarios y las direcciones IP es un poco tonto.

En segundo lugar, para restablecer una cuenta necesita eliminar datos que son útiles en términos de un seguimiento de auditoría. ¿Planeaba restablecer la cuenta después de un inicio de sesión exitoso?

En tercer lugar, no protege contra un ataque distribuido, o uno con direcciones falsas.

Si fuera yo, iría con ...

SELECT SUM(score)
FROM (
   SELECT COUNT(*) * ipweight AS score
   FROM logins
   WHERE failed=true
   AND ip=INET_ATON(*client_address*) 
   AND ip <> *trusted_device*
   AND timestamp>NOW - INTERVAL *config_value* MINUTES
   UNION
   SELECT COUNT(*) * acctweight AS score
   FROM logins
   WHERE failed=true
   AND username=*supplied_username* 
   AND ip <> *trusted_device*
   AND timestamp>NOW - INTERVAL *config_value* MINUTES
   UNION
   SELECT COUNT(*) * allweight AS score
   FROM logins
   WHERE failed=true
   AND ip <> *trusted_device*
   AND timestamp>NOW - INTERVAL *config_value* MINUTES
)

(Esto puede extenderse con otros atributos como el agente de usuario)

Establezca un umbral inferior al bloqueo en el que necesita que el usuario complete una verificación adicional (como un capcha).

Simplemente registra el intento (dirección IP, nombre de usuario, marca de tiempo, resultado) en la base de datos (no el tiempo de bloqueo).

Tenga en cuenta que representar la dirección IP en su formato nativo (entero) en su base de datos es casi siempre una buena idea. Aquí ofrece la oportunidad de agregar fallas en un bloque de red arbitrario.

    
respondido por el symcbean 09.10.2016 - 13:38
fuente
0

Este método no es muy bueno.

Recuerde que no tengo que enviarle solicitudes a través de su sitio web. Puedo dirigir mis solicitudes a través de un proxy y enviarle direcciones IP completamente falsas. Además, lo mismo se aplica al almacenamiento local, las cookies (y las sesiones, que se basan en las cookies). Puedo enviarte solicitudes que tienen absolutamente ninguna información de identificación .

Entonces, esto esencialmente te deja con dos opciones.

Primero, bloqueo basado en nombre de usuario. Esta opción no es buena, porque un atacante anónimo podría impedirle iniciar sesión sin que sea su culpa.

Segundo, y el bueno, es aplicar un captcha. Creo que escribir su propio captcha es una pérdida de tiempo y no es eficiente porque hoy en día existen muy buenos sistemas que pueden interpretar texto escrito en captchas y resolverlos fácilmente. Recomiendo ReCaptcha de Google : está probado y probado.

    
respondido por el Tom 09.10.2016 - 10:29
fuente

Lea otras preguntas en las etiquetas