Visualizzazione risultati 1 fino 19 di 19

Discussione: [PHP] Sistema anti bruteforce

  1. #1
    Guest

    Predefinito [PHP] Sistema anti bruteforce

    Volevo creare il tipico sistema della serie "Password errata: Puoi effettuare altri 5 tentativi per i prossimi 30 minuti".. Solo che non ho molto chiaro "sommariamente" come dovrebbe essere sviluppato il sistema... Non vi chiedo il codice, ma solo "tecnicamente" come dovrebbe essere sviluppato..

  2. #2
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Potresti registrarti l'indirizzo IP di chi tenta il login e se non riesce a loggarsi aggiungi in una bella tabella l'indirizzo IP e la data e l'ora. Nella pagina del login controllerai quanti tentativi sono stati fatti dall'IP nell'ultima mezz'ora e se supera il numero massimo non gli fai fare il login.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  3. #3
    Guest

    Predefinito

    Stavo pensando:
    Metti un input hidden nel form di login.php
    Codice PHP:
    <?
    $tentativi_massimi
    =; // Definisci il numero massimo di tentativi
    $_GET['tentativi_rimasti']=$tentativi_effettuati;
    $tentativi_rimasti=$tentativi_massimi-$tentativi_effettuati;
    ?>
    <input type=hidden name=tentativi_rimasti value=$tentativi_rimasti>
    Che invii alla pagina di login in modo tale che:
    Codice PHP:
    $_POST['tentativi_rimasti']=$tentativi_rimasti;
    // Se il login è sbagliato
    if ($tentativi_rimasti==0) echo "Hai esaurito il numero di tentativi massimi. Torna più tardi.";
    exit();
    //Uccide tutto
    else
    {
    // Rimandi l'utente alla pagina di login inviando il numero di tentativi rimasti via metodo get
    header('Location:login.php?tentativi_rimasti');
    }
    Ha senso?
    Ultima modifica di JoErNanO : 18-03-2006 alle ore 18.12.48

  4. #4
    Guest

    Predefinito

    io controllerei più che sull'ip, sul nickname usato in modo ke anche se uno si disconnette e si riconnette i tentativi sono sempre quelli.
    quindi il controllo lo devi fare con l'username postato non con l'ip dell'utente.

  5. #5
    Guest

    Predefinito

    mmm..... la faccenda diventa piu complicata del previsto...

  6. #6
    Guest

    Predefinito

    Codice PHP:
    $max = 5; #massime possibilità
    $timeout = 30 * 60; #30 min * 60 sec
    $count = 0;
    $user = $_POST['user'];
    $time = time() - $timeout;

    $query = mysql_query("SELECT COUNT(*) FROM log_login WHERE user = '{$user}' AND time > '{$time}'", $db);

    $count = mysql_result($query, 0);

    if(
    $count >= 5 )
    {
    #error message
    }
    else
    {
    #repeat login
    }
    la tabella la crei cosi: id | user | time

  7. #7
    Guest

    Predefinito

    Grazie Jostock! Stavo lavorando piu o meno a qualcosa del genere :)

    Ecco la funzione che ho sviluppato fino ad ora. E' ancora in fase di test:

    Codice PHP:
    function login_errati($user_name) {
    $ora = date("G:i");

    $timeoutseconds = 60 * 30; // Secondi
    $timestamp = time(); // orario in cui l'utente si sta collegando
    $timeout = $timestamp-$timeoutseconds;
    $ip=$_SERVER['REMOTE_ADDR'];
    $ph=$_SERVER['PHP_SELF'];


    $insert = mysql_query("INSERT INTO login_errati VALUES ('$timestamp', '$ip', '$user_name')");

    $delete = mysql_query("DELETE FROM login_errati WHERE timestamp <= $timeout"); //cancella TUTTI i record in cui timestamp è inferiore a $timeout

    $result = mysql_query("SELECT ip FROM login_errati WHERE ip='$ip'");

    $tentativi = mysql_num_rows($result);
    //mysql_close();
    return $tentativi;
    }

    A questo punto vediamo un po... devo studiare il sistema di bloccare il furbone...
    Ultima modifica di attorianzo : 18-03-2006 alle ore 19.08.31

  8. #8
    Guest

    Predefinito

    Non sarebbe meglio memorizzare i tentativi rimanenti in una variabile di sessione?
    Anche perchè se l'utente ha un ip dinamico basterebbe disconnettersi e riconnettersi per vanificare tutto.
    Ultima modifica di tuttoeniente2 : 18-03-2006 alle ore 19.30.13

  9. #9
    Guest

    Predefinito

    con una sessione basta che chiude il browser e lo riapre ed ecco che può rifare nuovamente 5 login.
    cmq il sistema era basato sull'username dell'utente non sull'ip.

  10. #10
    Guest

    Predefinito

    Ho risolto così, così taglio la testa al toro..
    La tabella è così composta: timestamp, ip, user_name

    faccio due select

    Codice PHP:
    $result = mysql_query("SELECT ip FROM login_errati WHERE ip='$ip'");
    $result2 = mysql_query("SELECT user_name FROM login_errati WHERE user_name='$user_name'");
    $tentativi1 = mysql_num_rows($result);
    $tentativi2 = mysql_num_rows($result2);


    if (
    $tentativi1 >= $tentativi2) $tentativi = $tentativi1;
    else
    $tentativi = $tentativi2;
    se $tentativi è maggiore di 5 allora viene bloccato...
    In questo modo Si tiene conto sia dell'ip, che dell'utente qualora il furbone si accanisca contro un nick_name in particolare..... e via.. che dite?
    Ultima modifica di attorianzo : 18-03-2006 alle ore 20.36.00

  11. #11
    Guest

    Predefinito

    Citazione Originalmente inviato da jostock
    con una sessione basta che chiude il browser e lo riapre ed ecco che può rifare nuovamente 5 login.
    cmq il sistema era basato sull'username dell'utente non sull'ip.
    Ogni soluzione ha i suoi "limiti".
    Fatto sull' username, se uno prova a fregarti l'account tentando di mettere la tua password... poi toglie anche a te la possibilità di fare il login.

  12. #12
    Guest

    Predefinito

    si... però.. la sicurezza dell'account è sicuramente maggiore...

  13. #13
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Una protezione di questo tipo per un sito web ha senso solo se la password è grande 4 caratteri, altrimenti è uno spreco di tempo.
    Un attacco dl genere non riuscirebbe mai, ogni pagina viene caricata se si è fortunatissimi in 1 secondo,, un attacco bf non sarebbe deleterio per la password, ma sarebbe un attacco dos (protezione o meno)
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  14. #14
    Guest

    Predefinito

    Citazione Originalmente inviato da binarysun
    Uun attacco bf non sarebbe deleterio per la password, ma sarebbe un attacco dos (protezione o meno)
    Potresti essere piu chiaro? Io non ho mai capito come può essere fatto un attacco automatico in un sito... Quindi cerco di premunirmi, ma in realtà non so assolutamente da cosa cerco di proteggermi...

    Dove posso trovare uno di questi software che fanno attacchi automatici, per fare dei test?

  15. #15
    L'avatar di webscript
    webscript non è connesso Utente attivo
    Data registrazione
    28-11-2004
    Messaggi
    320

    Predefinito

    atto, na cosa... sai che io potrei sfruttare quel sistema per non far più entrare delle persone sull'account? mi creo uno script automatico che fa il bruteforce per x volte, e poi si prende na pausa di y secondi... e magari negli y sec, prende n'altro utente... creando un ciclo...

    insomma... password = responsabilità utenti... se loro la fanno di un carattere...

    cmq in ordine crescente...

    Controllo nome-login
    Ip
    Sessione
    Cookie

  16. #16
    Guest

    Predefinito

    cmq nello script che hai postato ti sei scordato di inserire il time nelle condizioni del WHERE

  17. #17
    Guest

    Predefinito

    Insomma ma... gli altri siti come fanno? Altervista come fa a limitare il numero di sbagli nel login? Fa capo all'user-name o all'ip?

    sai che io potrei sfruttare quel sistema per non far più entrare delle persone sull'account?
    E' effettivamente una cosa a cui non avevo pensato... Eppure, mentre mi viene facile a pensare a un attacco da parte di un cracker che vuole approfittarsi dei dati personali di un utente e quindi del suo account, mi viene invece difficile pensare che un cracker voglia creare un attacco del genere col solo scopo di non fare loggare utenti al sito....

    Cmq tieni presente che, al momento, lo script tiene conto non solo del numero di accessi sbagliati di un determinato nick-name (il che porterebbe al problema da te sollevato) ma anche all'ip... Quindi il tuo script dovrebbe tenere conto anche del disconnettersi e di riconnettersi...

    password = responsabilità utenti... se loro la fanno di un carattere...
    Non è nemmeno possibile! In fase di registrazione dell'utente ho imposto che la password sia non meno di 7 caratteri!

    cmq nello script che hai postato ti sei scordato di inserire il time nelle condizioni del WHERE
    Mmm.... no va beh non ci dovrebbe essere bisogno perchè in realtà è così:
    $delete = mysql_query("DELETE FROM login_errati WHERE timestamp <= $timeout"); //cancella TUTTI i record in cui timestamp è inferiore a $timeout

    $result = mysql_query("SELECT ip FROM login_errati WHERE ip='$ip'");
    $result2 = mysql_query("SELECT user_name FROM login_errati WHERE user_name='$user_name'");
    $tentativi1 = mysql_num_rows($result);
    $tentativi2 = mysql_num_rows($result2);

    if ($tentativi1 >= $tentativi2) $tentativi = $tentativi1;
    else $tentativi = $tentativi2;

  18. #18
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Altervista non blocca i tentativi(o almeno non penso)
    Riguardo al discorso che è inutile una protezione del genere basta calcolare questo:

    Diciamo che un faccio un programma che inserisce password a raffica per trovare la tua.
    Diciamo che il tuo script da momento in cui legge i dati a quello in cui ti da una risposta impiega 1 secondo (in relatà sono minimo 3 secondi).
    Diciamo che nella password ci sono solo letteremaiuscole, minuscole e numeri.
    Con un password di 8 caratteri le combinazioni possibili sono 62^8, calcolando che in media ci vogliono la metà della prove, dovremmo interrogare la pagina
    109170052792448 volte.
    Se per ogni prova ci mettiamo 1 secondo impiegheremmo 30325014664 giorni.

    A quel punto O finisci la banda O il tuo server va in tilt per l'elevato numero di richieste.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  19. #19
    Guest

    Predefinito

    Citazione Originalmente inviato da binarysun
    O il tuo server va in tilt per l'elevato numero di richieste.
    Denial Of Service.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •