Comment empêcher les soumissions multiples de formulaires en PHP ?

Susan Sarandon
Libérer: 2024-11-10 06:43:02
original
513 Les gens l'ont consulté

How to Prevent Multiple Form Submissions in PHP?

Lutter contre les soumissions de formulaires multiples en PHP sur plusieurs clics

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.

Prévenir les soumissions multiples de formulaires

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.

Un exemple pratique

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>
Copier après la connexion

Amélioration de l'expérience utilisateur avec la redirection

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal