Cómo prevenir el envío de formularios múltiples en múltiples clics en PHPCómo prevenir el envío de formularios múltiples en múltiples clics en PHP
Respuesta
Se puede deshabilitar el botón después de que el primer clic (usando JavaScript) y también tienen un cheque en la parte posterior -final (por si acaso deshabilitaron su JavaScript) que verifica si se enviaron recientemente.
Hay muchas maneras diferentes de hacer el control en el back-end. Una forma sería establecer una variable de sesión cuando hagan clic en ella la primera vez, lo que puede hacer que el sistema sepa que está procesando. Si hacen clic en una segunda, tercera o cuarta vez, entonces puede simplemente verificar la variable de sesión, y si eso indica que ya se ha hecho clic, no se procesará.
Ese es solo un ejemplo: podría usarlo como un comienzo.
Utilice un token único generado cada vez que muestre un formulario y que solo se puede usar una vez; también es útil para prevenir ataques CSRF y replay. Un pequeño ejemplo:
<?php
session_start();
/**
* Creates a token usable in a form
* @return string
*/
function getToken(){
$token = sha1(mt_rand());
if(!isset($_SESSION['tokens'])){
$_SESSION['tokens'] = array($token => 1);
}
else{
$_SESSION['tokens'][$token] = 1;
}
return $token;
}
/**
* Check if a token is valid. Removes it from the valid tokens list
* @param string $token The token
* @return bool
*/
function isTokenValid($token){
if(!empty($_SESSION['tokens'][$token])){
unset($_SESSION['tokens'][$token]);
return true;
}
return false;
}
// Check if a form has been sent
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
if(isTokenValid($postedToken)){
// Process form
}
else{
// Do something about the error
}
}
// Get a token for the form we're displaying
$token = getToken();
?>
<form method="post">
<fieldset>
<input type="hidden" name="token" value="<?php echo $token;?>"/>
<!-- Add form content -->
</fieldset>
</form>
combinarlo con una redirección por lo que mantener un comportamiento posterior y delantero perfecto. Consulte el patrón POST/redirect/GET para obtener más información sobre la redirección.
¿Alguien sabe de algún problema, como problemas de seguridad, con este código? –
Creo que falta el filtro en $ postingToken = filter_input (INPUT_POST, 'token'); – zeckdude
Se podría añadir algo como esto
<input type="hidden" name="form-token" value="someRandomNumber">
A continuación, en el back-end, usted tiene una manera de identificar guardar múltiples envíos de formularios. Esta solución, por supuesto, tiene algo de equipaje ya que tiene que eliminar tokens de formularios que sabe que terminaron de procesar, etc.
En la mayoría de los casos, una forma deshabilitada funciona, por ejemplo, al deshabilitar el botón o agregando return false
al evento de envío de formularios (aunque no estoy seguro de si esto funciona sin jQuery).
Oh, bueno, parece que llegué un poco tarde con mi respuesta ... * votando otras respuestas * – Mike
Recomiendo deshabilitar el botón enviar, porque en caso de un problema de red temporal (es decir, la solicitud no se ha realizado), si el usuario elige abortar la presentación (tecla Esc/botón Detener), no puede enviar de nuevo una vez que se haya restaurado el servicio de red, y en su lugar tendrá que volver a cargar la página y completar todas las entradas del formulario nuevamente.
Esta es la respuesta más común, conviene a su problema
¿Puede usted acaba de ocultar el botón de clic? No afectaría el procesamiento del formulario (ya que sé que el problema es con la desactivación inmediata del botón), pero esencialmente haría lo mismo. Si realmente te preocupa, incluso podrías mostrar otro botón que en realidad no hace nada. Podría ser un trabajo poco convencional, pero no obstante, una solución alternativa.
- 1. Prevenir eventos de clics múltiples activando JQuery
- 2. Múltiples botones/formularios de envío en Rails
- 3. Contabilización/envío de formularios múltiples en jQuery
- 4. Evitar el envío de formularios múltiples
- 5. ¿Cómo prevenir múltiples publicaciones en MVC3?
- 6. Múltiples formularios HTML en una página
- 7. ¿Cómo prevenir insertos múltiples al enviar un formulario en PHP?
- 8. Múltiples botones de envío php acciones diferentes
- 9. ¿Cómo prevenir múltiples definiciones en C?
- 10. Enviar formularios múltiples con un botón de envío
- 11. Múltiples botones de envío
- 12. Impedir instancias de formularios múltiples
- 13. ¿Serializar múltiples formularios juntos?
- 14. Impedir presentaciones de formularios múltiples en MVC 3 con validación
- 15. Cómo prevenir múltiples inicios de sesión en el sitio web de PHP
- 16. Django fábrica de formularios múltiples
- 17. MVC asp.net: Enviar formularios múltiples
- 18. Múltiples formularios en la página ASP.NET
- 19. ¿Cómo usar múltiples formularios en una página con JSF 2.0?
- 20. envío de múltiples CC y BCC con PHP PEAR CORREO
- 21. presentando múltiples formularios con AJAX
- 22. ¿Cómo manejar múltiples colecciones de formularios anidados en Symfony 2.0?
- 23. ¿Cómo prevenir el envío del formulario?
- 24. múltiples validación de formularios conflicto CodeIgniter
- 25. JSF: Ejecutar valores de formularios múltiples
- 26. Prevenir selecciones múltiples del mismo valor
- 27. ¿Cómo concatenar múltiples operadores ternarios en PHP?
- 28. Cómo ordenar matrices múltiples en PHP
- 29. Php delimitadores múltiples en explotar
- 30. ¿Prevenir múltiples instancias de una aplicación determinada en .NET?
deshabilitar el botón de enviar! –
Como la pregunta es sobre el comportamiento del lado del servidor (PHP), recomendaría ver la siguiente pregunta: http://stackoverflow.com/questions/218907/how-to-handle-multiple-submissions-server-side – Kel
'' – karim79