Mi è venuta in mente una tecnica per impedire l'invio di moduli duplicati andando avanti/indietro o aggiornando la pagina. E ho pensato di metterlo in discussione qui, ho già testato un campione non in ambiente di produzione, quali sono i difetti che puoi identificare?Prevenire invii duplicati di moduli
Si noti che sono a conoscenza dell'utilizzo dei token modulo, che ti difenderanno dagli attacchi CSRF e che non è stato aggiunto nei passaggi seguenti.
Generi i Modulo ID per ciascun modulo, e usarlo come campo nascosto nella forma:
$formid = microtime(true)*10000;
- On Form Submit:
Convalida dai dati
Calcola l'hash dei dati dei campi modulo
$allvals = ''; foreach($_POST as $k=>$v){ $allvals .= $v; } $formHash = sha1($allvals);
Convalida l'hash del modulo confrontando con gli hash precedentemente salvati. il valore della sessione viene associato a ogni modulo dalla variabile $ formid.
$allowAction = true; if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){ $allowAction = false; }
- se sotto forma di hash non è stato trovato, significa che questa è la prima forma volta presentata o i dati del modulo è cambiato.
Se i dati salvati (a base di dati, per esempio), salvare sotto forma di hash per sessione:
$_SESSION['formHash'][$_POST['formid']] = $formHash;
La versione completa del codice: http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/
consideri il benchmarking snippet di hash contro '$ formHash = sha1 (serializzare ($ _ POST));'. Avrà anche le chiavi di hash, che potrebbero essere o meno vantaggiose. – Dan
Probabilmente collegato/DUP, http://stackoverflow.com/questions/4614052/how-to-prevent-multiple-form-submission-on-multiple-clicks-in-php/4614310#4614310 – user562374
Eventuali duplicati di http://stackoverflow.com/questions/218907/how-to-handle-multiple-submissions-server-side –