Distinguere l’uomo dalla macchina in modo accessibile

Un ticket per ciascuna richiesta

Quest’idea leggermente più complessa è che, magari lavorando sull’ora del server, il nome dei campi di un modulo cambi continuamente e che essi saranno validi solo per un determinato intervallo temporale. Facciamo un esempio: l’utente X accede al modulo alle ore 15.27.18 ed il limite di tempo per compilare il modulo è di 5 minuti il limite orario entro il quale dovrà eseguire la richiesta al server sarà alle 15.32.18. Però, per evitare che un sistema automatico possa riconoscere il nostro metodo e ne faccia uso, l’utente, dovrà compilare la richiesta in non meno di 30 secondi. Quindi l’intervallo temporale in cui la richiesta risulterà valida sarà tra le 15.27.38 e le 15.32.18.

Andiamo a creare l’algoritmo che ci crea questo codice temporale:

$ora = date('His');     // riporta l'ora nel formato HHMMSS (Ore Minuti Secondi)
$codice = $ora;

/*
...
In questo punto si portebbe considerare di introdurre un algoritmo
per la codifica del codice
...
*/

Quindi a seguire il codice del modulo sarà identico a quello presentato nel paragrafo precedente.

<form method="post" action="scrivi.php">
  <p>
    <label for="nome">Nome</label>
    <input type="text" value="" id="nome" name="nome<?=$codice?>" />
  </p>
  <p>
    <label for="nome">Cognome</label>
    <input type="text" value="" id="conome" name="cognome<?=$codice?>" />
  </p>
  <p>
    <input type="submit" name="conferma<?=$codice?>" value="conferma" />
  </p>
</form>

L’algoritmo che si occupa invece di verificare che ci sia un codice valido è il seguente:

// Posso passare alla verifica
$ticket_max = Date('His');
$ticket_min = Date('His') - 430;        // 4 min + 30 secondi;
if($ticket_min%100>59) $ticket_min -= 50;

foreach($_POST as $key => $value){
  $current_ticket = substr($key,-6);
  if($current_ticket >= $ticket_min &amp;&amp; $current_ticket <= $ticket_max){
    if($ticket!='' &amp;&amp; $ticket != $current_ticket){
      $ticket = '';
      break;
    }else{
      $ticket = $current_ticket;
    }
  }else{
    $ticket = '';
    break;
  }
}

if($ticket == ''){
  // Il codice introdotto non è corretto e non è compreso nell'intervallo di tempo valido
  header('location: modulo.php?error=y');
  exit();
}else{
  // Il ticket è stato identificato e quindi è possibile scrivere le informazioni
  $cognome = $_POST['cognome' . $ticket];
  $nome = $_POST['nome' . $ticket];
}

Molto semplicemente, viene fatto un controllo su tutti i campi del modulo valutando che abbiano lo stesso codice e, che questo corrisponda effettivamente ad uno di quelli validi negli ultimi minuti (compreso tra $ticket_min e $ticket_max). Se così fosse, la variabile $ticket riporta esattamente il codice assegnato dal server in fase di inserimento all’utente. In alternativa il codice sarà vuoto.

Se il codice è vuoto, il sistema dirotterà l’utente di nuovo sulla pagina di inserimento provvedendo quindi ad assegnare un nuovo ticket, valido per altri 4 minuti e 30 secondi!

I pro di questa metodologia sono dati dalla durata prestabilita della validità massima del ticket e dal fatto che si prevede un’attesa minima prima di un salvataggio. Questo garantisce che un sistema automatico non possa leggere un modulo ed inviare la risposta al server entro pochi secondi.

I contro, almeno presenti nell’esempio esposto, sono dovuti dalla disponibilità del codice in chiaro (quindi facilmente identificabile dall’utente che potrebbe elaborare un algoritmo di hacking adeguato) e che il ticket risulta valido tutti i giorni alla stessa ora (ma, in tal caso, basta estendere il controllo aggiungendo nel codice del ticket la data nel formato “AnnoMeseGiornoOreMinutiSecondi”).


Pubblicato

in

, ,

da

Tag:

%d blogger hanno fatto clic su Mi Piace per questo: