Le sessioni sono sicure per captcha al login fallito?

2

Non mi piace scrivere domande a risposta aperta ma ho una rapida domanda di sicurezza. Ho uno script di accesso PHP che mostra un CAPTCHA sul terzo tentativo di accesso fallito. Il modo in cui sto contando i login non riusciti è utilizzando i dati di sessione. È sicuro? C'è un modo migliore per farlo? Forse memorizzare l'IP in una tabella di database? Non sono davvero sicuro di come i bot e i programmi che provano ad usare la word list funzionino davvero.

Grazie

    
posta BandonRandon 30.05.2011 - 06:49
fonte

2 risposte

4

Ogni volta che chiami session_start () php crea o legge (se già esiste) un cookie chiamato PHPSESSID. Questo cookie memorizza un identificativo univoco per la sessione del browser, il suo modo di php di raccontare una sessione dall'altra. Un bot può facilmente aggiornare questo cookie con un nuovo identificatore su ogni richiesta e indurre php in errore nel riconoscere ogni login fallito come prima volta, quindi non è sicuro.

Esattamente lo stesso può essere fatto con l'IP, tutte le variabili $ _SERVER possono essere manipolate. Un robot intelligente può inviare IP diversi per ogni richiesta. Quindi, se stai combattendo contro un bot dannoso, le richieste non sono identificabili.

Due soluzioni, una facile e una paranoica:

Soluzione facile

Aggiungi CAPTCHA per impostazione predefinita nella pagina di accesso.

Soluzione paranoica

Crea una tabella nel tuo database per registrare il timestamp di ogni singola richiesta, indipendentemente dall'IP o da qualsiasi altro identificatore. Ogni volta che ricevi una richiesta alla tua pagina di login, decidi se mostrare il CAPTCHA in base al tempo trascorso dalla richiesta immediatamente precedente. Assicurati di avere un cron job (o manualmente) per eliminare vecchie righe dalla tabella, quindi non diventerà molto grande molto presto.

Dovrai scegliere un intervallo ragionevole, basato sul traffico del tuo sito. Assicurati che l'intervallo sia configurabile, perché si spera che il traffico aumenti nel tempo. Il successo o il fallimento della soluzione dipende dalla scelta di un intervallo bilanciato.

Per ulteriori punti paranoico registra e confronta microtime ().

Normalmente uno script di login non ha bisogno di un CAPTCHA, poiché la pressione sul database per controllare due campi indicizzati su una tabella di poche migliaia di utenti non dovrebbe essere molto. Ma se il tuo sito ha più di qualche migliaio di utenti, o hai validi motivi per sospettare che un bot sia mirato a te, la soluzione paranoica dovrebbe essere sufficiente.

Aggiorna :

Come nota Dean, fingere l'IP non è banale, questo è ciò che intendevo per un intelligente bot, non ho davvero pensato che fosse prezioso da elaborare ulteriormente. Esiste una domanda relativa all'indirizzo serverfault.stackexchange con una risposta dettagliata accettata sul importa. (Articoli correlati su Symantec e Linux Security )

Ovviamente sarebbe un po ' sicuro da usare con una soluzione basata su IP, specialmente se il tuo sito probabilmente non è un obiettivo previsto (ma come puoi sapere quello?). Le cose aggiuntive che devi considerare in una soluzione basata su IP sarebbero gli IP dinamici e come distinguere tra utenti firewall.

Personalmente, vado sempre con l'approccio paranoico, e non mi fido mai assolutamente delle variabili $ _SESSION, $ _COOKIE e $ _SERVER.

    
risposta data 30.05.2011 - 08:37
fonte
-1

Che tipo di abuso è più probabile che si verifichi: qualcuno che cerca di entrare in un account specifico o qualcuno che cerca di trovare un accesso casuale (provando vari nomi utente, probabilmente ottenuti da un elenco di utenti registrati.)

Per il primo, è possibile memorizzare i tentativi di accesso per nome utente. Ciò impedisce anche i tentativi di accesso tramite i proxy (dove IP non sarebbe sempre lo stesso). Probabilmente la sessione non funziona - probabilmente solo influenzerà le persone che hanno appena commesso degli errori, chiunque intenzionalmente tentando di entrare probabilmente cancellerà comunque i cookie. Per evitare questo tipo, potresti richiedere la riattivazione dell'account tramite un link di invio via email (nota, imposterei il limite un po 'più alto di tre, dato che è fastidioso. Potresti ancora combinarlo con un captcha - non fermerà nessuno molto deliberato ma potrebbe essere d'aiuto come prima linea di difesa e demotivare alcuni script kiddies.)

Per il secondo, non puoi fare molto meglio di IP, ho paura. (Esegui le richieste di log, un pattern potrebbe emergere). Per evitare che questo set abbia un tempo minimo tra i tentativi (su IP o anche sul nome utente), inizialmente come 1 richiesta al secondo - nulla che un normale utente noterebbe, e dopo 3 tentativi lo imposta su 10s, dopo 10 tentativi lo incrementa a metà minuto (e puoi continuare a incrementare.) (Finetune se necessario) e considera la possibilità che gli utenti provengano da una rete chiusa, quindi più utenti avranno lo stesso IP legittimamente.)

Sconsiglio di usare sempre un captcha, che infastidisce l'utente senza alcun beneficio.

    
risposta data 30.05.2011 - 11:03
fonte

Leggi altre domande sui tag