PHP OOP Brute Attack Class

  • Creatore Discussione Creatore Discussione Phelps
  • Data di inizio Data di inizio

Phelps

Utente Attivo
17 Dic 2018
50
0
6
Ciao ragazzi..
Qualcuno mi può aiutare nell implementare nel mio progettino di studio PHP una classe che gestisca il brute Attack sul forum Di login?
Ho fatto qualche ricerca in giro ho visto che è possibile farlo con database ma anche senza database con la cache.
Ho guardato in giro ma purtroppo non tutti scrivono come mangiano. :eek:Sembra che più si scrive difficile è meglio èo_O
Grazie!;)
 
ciao macus. Ben ritrovato.
Allora documentandomi un pò sulla sicurezza ho appreso che il metodo di bloccare un malintenzionato con il suo IP e timestamp da DB non è un metodo sicuro visto che è possibile cambiare IP nel corso di una sessione.
Ho visto invece che implementare il Lock out mediante sessioni potrebbe essere piu efficace.

PHP:
<?php
/**
 *
 */
class Brute
{

  const LOCK_TRIES = 3;
  const LOCK_TIME = 10;


  public static function startLockOut()
  {
  $_SESSION['lock-time'] = date('Y-m-d H:i:s');
  }

  public static function endLockOut()
  {
    if (!empty($_SESSION['lock-time'])) {
      unset($_SESSION['lock-time']);
    }
    if (!empty($_SESSION['lock-tries'])) {
      unset($_SESSION['lock-tries']);
    }
  }

  public static function checkLockOutTime()
  {
    if (isset($_SESSION['lock-time'])) {
      $current_time = new DateTime(date('Y-m-d H:i:s'));
      $wait_time = new DateTime($_SESSION['lock-time']);
      $wait_time->modify('+' . self::LOCK_TIME . ' minutes');
      if ($current_time > $wait_time) {
        self::endLockOut();
        return true;
      }else {
        return false;
      }
    }
    return true;
  }

  public static function checkLockOutTries()
  {
    if (empty($_SESSION['lock-tries'])) {
      $_SESSION['lock-tries'] = 1;
    } else {
      $_SESSION['lock-tries'] += 1;
    }

    if ($_SESSION['lock-tries'] > self::LOCK_TRIES) {
      self::startLockOut();
      return false;
    } else {
      return true;
    }
  }

}

le due funzioni checkLockOutTime() e checkLockOutTries() verranno richiamate in due variabili nella pagina di controllo login, se risulteranno true insieme al controllo di username e password, ok.... se risulteranno false bloccheranno per 3 tentativi e si sblocchera dopo 10 minuti e il display nella pagina di login sarà
PHP:
$tries = empty($_SESSION['lock-tries']) ? null : $_SESSION['lock-tries'];
        $time = empty($_SESSION['lock-time']) ? null : $_SESSION['lock-time'];
        $message = "User or Password Wrong ";
        $message2 = "Lock tries: $tries | lock time: $time";
      }

se al terzo tentativo le credenziali sono tutte vere entrerà e se poi schiaccerò logout, nella classe Session alla funzione logout faccio unset di $_SESSION[look-tries]

funziona !!!
Che ne pensi??
 
Ultima modifica di un moderatore:
@Phelps
Quando posti del codice PHP usa il tag
php.png
al posto del tag
code.gif
!
Grazie
 
Basterebbe implementare CSRF con rigenerazione ad ogni iterazione, aggiungi l'input nel form mettendo in redis il valore univoco inserito nell'input...
Il primo match effettua la verifica del token con quello inviato, se differente applichi le tue politiche di restrizione...

Quello che hai scritto è aggirabile semplicemente rigenerando le sessioni, funziona SOLO nella stessa finestra browser, ma se vieni attaccato stai pur certo che non lo si fa da UI..
 
il token già lo invio come input nascosto. Controllo che l'esadecimale generato e messo in sessione e poi inviato via form sia uguale a quello ricevuto via post. Insieme al controllo su campo email di tipo FILTER_VALIDATE_EMAIL e insieme anche ad una lunghezza minima della password di 6 caratteri e i caratteri accettati.
se questo controllo ritorna true allora si passa a cercare l'user via email, e se lo trova verifica la password hash.
ad entrambi user e password errati è collegato il conteggio delle possibilità per sbagliare.

Si è chiaro puoi rigenerare le sessioni solo se chiudi e riapri la finestra browser.
Se riapri la finestra si riavrebbe comunque lo stesso muro. Non aspetti 10min ma torni ai tentativi.
Cosa potrebbero fare allora con questo codice non da UI?
 
grazie per il link.. Dovrò trovare un po' di tempo per leggerlo:rolleyes:
A meno che io non sia Intesa San Paolo o Unicredit, ce né si deve avere di tempo e volontà da perdere per praticare un attacco del genere ad una povera piattaforma di un comune pseudoprogrammatore PHP:confused:

Tornando comunque alla possibilità di immettere nel DB una colonna IP ed una Timestamps. cosa potrei mettere per i scritto nella classe inputata per fermare un bruteforce attack con la sospensione IP?
Grazie.
 

Discussioni simili