La soumission de formulaires peut parfois être déclenchée involontairement plusieurs fois de suite, entraînant un comportement indésirable et des incohérences de données. Cette situation peut survenir en raison de divers facteurs, tels que des clics multiples sur un bouton ou un traitement lent du formulaire. PHP fournit des techniques pour empêcher de telles soumissions multiples, garantissant ainsi l'intégrité des données.
Pour lutter contre les soumissions multiples, une approche largement utilisée consiste à utiliser un jeton généré à chaque fois qu'un formulaire est affiché. Ce token est ensuite soumis avec le formulaire et validé côté serveur. L'avantage essentiel de cette approche réside dans sa capacité à atténuer à la fois les attaques CSRF (Cross-Site Request Forgery) et les attaques par rejeu.
L'exemple ci-dessous démontre la création d'un fichier unique. jeton pour chaque affichage de formulaire, ainsi que sa validation lors de la soumission du formulaire.
<?php session_start(); /** * Generates a unique token for the form * @return string The token */ function getToken(){ $token = sha1(mt_rand()); if(!isset($_SESSION['tokens'])){ $_SESSION['tokens'] = array($token => 1); } else{ $_SESSION['tokens'][$token] = 1; } return $token; } /** * Validates the token and removes it from the list of valid tokens * @param string $token The token * @return bool Validation status */ function isTokenValid($token){ if(!empty($_SESSION['tokens'][$token])){ unset($_SESSION['tokens'][$token]); return true; } return false; } // Check if a form has been submitted $postedToken = filter_input(INPUT_POST, 'token'); if(!empty($postedToken)){ if(isTokenValid($postedToken)){ // Process form } else{ // Handle error } } // Get a token for the currently displayed form $token = getToken(); ?> <form method="post"> <fieldset> <input type="hidden" name="token" value="<?php echo $token; ?>"/> <!-- Form content --> </fieldset> </form>
La combinaison de l'approche basée sur les jetons avec une redirection améliore l'expérience utilisateur en garantissant une bonne comportement de navigation en arrière et en avant. En implémentant le modèle de conception POST / redirect / GET, vous pouvez empêcher une nouvelle soumission accidentelle lorsque l'utilisateur clique sur le bouton de retour ou actualise la page.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!