Maison >développement back-end >tutoriel php >Conseils de protection des formulaires PHP : Comment éviter les soumissions répétées de formulaires

Conseils de protection des formulaires PHP : Comment éviter les soumissions répétées de formulaires

WBOY
WBOYoriginal
2023-06-24 11:50:131919parcourir

Lors de l'utilisation de formulaires PHP pour la soumission de données, le problème de la soumission répétée de formulaires se produit souvent. Cela peut conduire à des données inexactes ou, pire encore, à des pannes du système. Il est donc très important de comprendre comment éviter les soumissions en double. Dans cet article, je présenterai quelques techniques de protection de formulaire PHP pour vous aider à prévenir efficacement les problèmes répétés de soumission de formulaires.

1. Ajoutez un jeton au formulaire

L'ajout d'un jeton au formulaire est un moyen courant d'éviter les soumissions répétées. Cette méthode fonctionne en ajoutant un champ masqué au formulaire contenant une valeur aléatoire unique. Lorsque le formulaire est soumis, le code PHP vérifiera si cette valeur correspond à la valeur stockée sur le serveur. S'ils ne correspondent pas, cela signifie que le formulaire a été soumis à plusieurs reprises et que les données ne seront pas traitées. Voici un exemple de base d'utilisation du jeton :

<?php
  session_start();
  if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['token'])) {
    $token = $_POST['token'];
    if ($_SESSION['token'] === $token) {
      //处理表单数据
      //...
      unset($_SESSION['token']);
    } else {
      echo '表单已提交!';
    }
  } else {
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
?>
  <form method="post">
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <!--其他表单元素-->
    <button type="submit">提交</button>
  </form>
<?php } ?>

Dans cet exemple, nous vérifions d'abord si la requête est POST, et si c'est le cas, vérifions si la valeur du jeton dans le formulaire correspond. Si les jetons correspondent, traitez les données du formulaire. Après avoir traité les données, nous utilisons la fonction unset pour supprimer le jeton de la SESSION car ce jeton n'est plus nécessaire. Si les jetons ne correspondent pas, le formulaire a été soumis deux fois et les données du formulaire ne seront pas traitées. Si la requête n'est pas un POST, nous générons un nouveau jeton, le stockons dans la SESSION et l'ajoutons au formulaire.

2. Utilisez la redirection

Après avoir soumis le formulaire, si vous utilisez toujours la même URL, le formulaire sera soumis à plusieurs reprises. Pour éviter cela, vous pouvez utiliser des redirections. Cette technique implique une page intermédiaire qui redirige l'utilisateur vers une autre page après la soumission du formulaire, plutôt que vers la page du formulaire d'origine. Voici un exemple d'utilisation de la redirection pour empêcher l'envoi répété d'un formulaire :

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //处理表单数据
    //...
    header('Location: success.php');
    exit;
  }
?>

Dans cet exemple, nous utilisons la fonction header pour rediriger l'utilisateur vers la page success.php après avoir traité les données du formulaire. Cette page est une page qui s'affiche après une soumission réussie. Elle ne contient aucun formulaire, l'utilisateur ne peut donc pas soumettre à nouveau le formulaire en utilisant le bouton "retour" du navigateur ou en rechargeant la page.

3. Désactivez le cache du navigateur

Mettez en cache le formulaire dans le navigateur, ce qui peut entraîner l'envoi répété du formulaire. Étant donné que les navigateurs peuvent mettre en cache les pages Web d'un site, le formulaire peut être soumis à nouveau lorsque l'utilisateur clique sur le bouton Précédent du navigateur. Pour éviter cela, vous devez désactiver la mise en cache du navigateur. Voici un exemple simple de désactivation de la mise en cache du navigateur :

<?php
  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");         // Date in the past
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
  header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");                                // HTTP/1.0
?>

Dans cet exemple, nous utilisons plusieurs en-têtes HTTP pour informer le navigateur de ne pas mettre en cache la page actuelle. Cela inclut un en-tête « Expire » pour les dates passées et plusieurs autres en-têtes sur la façon de traiter la page.

Conclusion

Lorsque vous utilisez des formulaires PHP, il est très important d'éviter les soumissions répétées. Les méthodes ci-dessus décrivent quelques techniques efficaces qui peuvent vous aider à éviter la soumission répétée de formulaires et à protéger la sécurité de vos données. Si vous souhaitez en savoir plus sur la défense des formulaires PHP, consultez la documentation PHP ou référez-vous aux blogs et articles d'autres développeurs PHP.

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!

Déclaration:
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