2011-01-06 13 views

Respuesta

5

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.

30

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.

+1

¿Alguien sabe de algún problema, como problemas de seguridad, con este código? –

+0

Creo que falta el filtro en $ postingToken = filter_input (INPUT_POST, 'token'); – zeckdude

1

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).

+1

Oh, bueno, parece que llegué un poco tarde con mi respuesta ... * votando otras respuestas * – Mike

1

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.

0

Esta es la respuesta más común, conviene a su problema

0

¿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.

Cuestiones relacionadas