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.