Eviter les doubles post ou doubles get avec les sessions

Description

Tout est dans le titre...

Un petit code simplifié à enrichir de nouvelles fonctionnalités.
(Testé en PHP 5).

Source / Exemple :


<?php

// Le fichier "class.session.php"
  
/**

  • Sessions
  • @author Serge Dominici
  • @version $Id$
  • @copyright 2005
  • @package GENERIC
    • /
/**
  • Classe générique de gestion des sessions des utilisateurs
  • Crée une session (ou restaure celle trouvée sur le serveur, via l'identifiant de session passé
  • dans une requête GET, POST ou par un cookie).
  • Permet notemment d'éviter les doubles POST ou les doubles GET.
  • @author Serge Dominici
  • @version $Id$
  • @copyright 2005
  • @package GENERIC
    • /
class Session { /**
  • Valeur de la session Client.
  • @var string $session_client_valide
  • @access private
    • /
private $session_client_valide; /**
  • Constructeur de la classe
  • @access protected
  • @return void
    • /
function __construct(){ session_start(); } /**
  • Génération d'un ID Client
  • Génération d'une chaine aléatoire de 32 caractères
  • @access private
  • @return string
    • /
private function generateID(){ // Génération d'un nombre aléatoire auquel on applique un hachage MD5 $this->session_client_valide = md5(mt_rand()); } /**
  • Récupération d'un nouvel ID Client
  • ID à utiliser dans les URL pour le GET ou dans une variable POST
  • @access public
  • @return string
    • /
public function getNewID(){ $this->generateID(); $_SESSION['session_client_valide']=$this->session_client_valide; return($this->session_client_valide); } /**
  • Récupération de l'ID Client courant
  • @access public
  • @return string ou FALSE
    • /
public function getCurrentID(){ if (isset($_SESSION['session_client_valide'])) { return($_SESSION['session_client_valide']); } else { return(FALSE); } } /**
  • Destruction de la session
  • Détruit toutes les données associées à la session courante.
  • Cette fonction ne détruit pas les variables globales associées à la session,
  • de même, elle ne détruit pas le cookie de session.
  • @access public
  • @return string ou FALSE
    • /
public function destroySession(){ session_destroy(); } } ?> <? // Le fichier "class.displayHTML.php" /**
  • Affichage HTML
  • @author Serge Dominici
  • @version $Id$
  • @copyright 2005
  • @package GENERIC
    • /
/**
  • Classe générique d'affichage HTML
  • @author Serge Dominici
  • @version $Id$
  • @copyright 2005
  • @package GENERIC
    • /
class DisplayHTML { /**
  • Charset de l'affichage HTML.
  • @var string $session_client_valide
  • @access private
    • /
private $charset; /**
  • Constructeur de la classe
  • @access protected
  • @param string $charset Jeux de caractères de la page
  • @return void
    • /
function __construct($charset = "UTF-8") { $this->charset = $charset; } /**
  • Affichage de l'en-tête
  • @access public
  • @param string $title Titre de la page
  • @return void
    • /
public function displayHeader($title = ""){ printf("<html>\n"); printf("<head>\n"); printf("<meta http-equiv=\"content-type\" content=\"text/html; charset=%s\">\n", $this->charset); printf("<title>%s</title>\n", addslashes($title)); printf("</head>\n"); printf("<body>\n"); } /**
  • Affichage du pied de page
  • @access public
  • @return void
    • /
public function displayFooter() { printf("</body>\n"); printf("</html>\n"); } } ?> <?php // Le fichier "test.php" /**
  • Eviter les doubles POST/GET
  • @author Serge Dominici
  • @version $Id$
  • @copyright 2005
  • @package GENERIC
    • /
require_once('class.session.php'); require_once('class.displayHTML.php'); // Ouverture de session $sess = new Session(); // Affichage de l'en-tête HTML $display = new DisplayHTML("ISO-8259-1"); $display->displayHeader("Anti double GET/POST"); // Existe-t-il une session if (isset($_GET['session'])) { $session_client=$_GET['session']; } else { $session_client_valide=$sess->getNewID(); $session_client=$session_client_valide; } // La session est-elle valide ? if ($session_client != $sess->getCurrentID()) { // NON => if (isset($_POST['texte'])) { printf("<p>Votre POST : \"<b>%s</b>\".<br />\n", addslashes($_POST['texte'])); printf("Je n'enregistrerai pas votre POST une deuxième fois !\n"); } $session_client_valide=$sess->getNewID(); } else { // OUI => $session_client_valide=$sess->getNewID(); if (isset($_POST['texte'])) { printf("<p>Votre POST : \"<b>%s</b>\".<br />\n", addslashes($_POST['texte'])); printf("Je fais quelque chose avec (exemple : enregistrement dans une base...).</p>\n"); printf("<font color=\"#FF0000\"><p>Actualisez la page avec F5 (si IE), Ctrl+R (si Firefox).</p></font>\n"); } } // Affichage d'un formulaire à poster printf("<form action=\"%s?session=%s\" method=\"POST\">\n", $_SERVER['PHP_SELF'], $session_client_valide); printf("<label>Du texte ici pour l'exemple :&nbsp;</label>\n"); printf("<input type=\"text\" name=\"texte\" />\n"); printf("<input type=\"submit\" name=\"go\" value=\"Valider\"/>\n"); printf("</form>\n"); printf("<a href=\"%s?session=%s\">Nouvelle session pour test.</a><br />\n", $_SERVER['PHP_SELF'], $session_client_valide); printf("<a href=\"%s\">Retour au début.</a><br />\n", $_SERVER['PHP_SELF']); $display->displayFooter(); ?>

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.