Inventé una técnica para evitar el envío de formularios duplicados retrocediendo o retrocediendo o actualizando la página. Y pensé en molerlo aquí, ya probé una muestra que no está en el entorno de producción, ¿cuáles son los defectos que puedes identificar?Prevención de envíos de formularios duplicados
Tenga en cuenta que conozco muy bien el uso de tokens de formulario, que lo defenderán de los ataques CSRF, y no se agregaron en los pasos a continuación.
-Generar la forma de identificación para cada forma, y utilizarlo como campo oculto en la forma:
$formid = microtime(true)*10000;
- El envío de formulario:
Validar a partir de datos
Calcular el hash de los campos de formulario de datos
$allvals = ''; foreach($_POST as $k=>$v){ $allvals .= $v; } $formHash = sha1($allvals);
Valide el hash de forma comparando con hashes previamente guardados. el valor de la sesión se asocia a cada formulario mediante la variable $ formid.
$allowAction = true; if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){ $allowAction = false; }
- si no se ha encontrado la forma de hash, significa que esta es la primera vez forma presentada o se cambia los datos del formulario.
Si los datos guardados (a base de datos, por ejemplo), guardar la forma de hash a la sesión:
$_SESSION['formHash'][$_POST['formid']] = $formHash;
versión completa del código: http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/
Considere el benchmarking de su fragmento de hash contra '$ formHash = sha1 (serialize ($ _ POST));'. También tendrá claves de hash, lo que puede o no ser beneficioso. – Dan
Posiblemente relacionado/dup, http://stackoverflow.com/questions/4614052/how-to-prevent-multiple-form-submission-on-multiple-clicks-in-php/4614310#4614310 – user562374
Posible duplicado de http://stackoverflow.com/questions/218907/how-to-handle-multiple-submissions-server-side –