Come bloccare i tentativi di accesso con SQL

0

Non voglio dal server forzare la forza bruta, ma non voglio usare un CAPTCHA perché non sono user-friendly / Non voglio fare affidamento su un'altra azienda - perché non ho intenzione di implementare il mio sistema captcha.

Ho pensato di creare una tabella attempts con questa struttura:

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

E lascia che l'utente abbia 5-10 tentativi, prima di resettare a 0 e aumentando il tempo di blocco di un fattore 2 - è in minuti.

Questo è un buon metodo per bloccare una forza bruta?

Avrei una logica come questa sul mio server: - abstracted

....
* 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());
....

Ho la sensazione che ci sia un modo più efficiente per farlo in modo nativo in SQL, io sono un novizio con SQL. (Sto usando postgresql).

Dopo aver visto ciò, suppongo che mi serva anche un campo di avvio, in modo da poter calcolare quando il blocco è scaduto.

EDIT: dopo aver fatto delle ricerche, ho letto / sto pensando di implementare fail2ban che controlla Apache / nginx e blocca gli utenti; un cookie che consente a un utente di connettersi nuovamente al proprio account senza Captcha / prova di lavoro, e quindi di far ottenere a captcha altri; o solo un captcha in combinazione con un blocco;

    
posta Tobiq 09.10.2016 - 05:23
fonte

2 risposte

1

Ci sono alcuni problemi che vedo con il tuo approccio.

In primo luogo, fornisce un percorso verso un attacco denial of service; qualcuno ha solo bisogno di continuare a fornire cattive password da un indirizzo IP per bloccarlo. Supponendo che una correlazione 1: 1 tra utenti e indirizzi IP sia un po 'sciocca.

In secondo luogo, per ripristinare un account è necessario eliminare i dati che sono utili in termini di una pista di controllo. Stavi programmando di resettare l'account dopo un login riuscito?

In terzo luogo, non protegge da un attacco distribuito o da uno con indirizzi falsificati.

Se fossi in me, andrei 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
)

(Questo può essere esteso con altri atrributes come user agent)

Imposta una soglia inferiore al blocco a cui richiedi all'utente di completare ulteriori verifiche (come un capcha).

Basta registrare il tentativo (indirizzo IP, nome utente, data / ora, risultato) nel database (non il tempo di blocco).

Nota che rappresentare l'indirizzo IP nel suo formato nativo (numero intero) nel tuo database è quasi sempre una buona idea. Qui offre l'opportunità di aggregare i fallimenti attraverso un netblock arbitrario.

    
risposta data 09.10.2016 - 13:38
fonte
0

Questo metodo non è molto buono.

Ricorda che non devo inviarti richieste tramite il tuo sito web. Posso indirizzare le mie richieste attraverso un proxy e inviarti IP completamente falsi. Inoltre, lo stesso vale per la memorizzazione locale, i cookie (e le sessioni - che si basano sui cookie). Posso inviarti richieste che hanno assolutamente nessuna informazione di identificazione .

Quindi, questo in sostanza ti lascia due opzioni.

Innanzitutto, blocca in base al nome utente. Questa opzione non è buona, perché un utente malintenzionato anonimo potrebbe impedirti di accedere senza che sia colpa tua.

Secondo, e quello buono, è applicare un captcha. Penso che scrivere il proprio captcha sia una perdita di tempo e non efficien perché oggi ci sono sistemi molto buoni che possono interpretare il testo scritto su captchas e risolverli facilmente. Raccomando ReCaptcha di Google : è provato e testato.

    
risposta data 09.10.2016 - 10:29
fonte

Leggi altre domande sui tag