Eviter les doubles post ou doubles get avec les sessions

Soyez le premier à donner votre avis sur cette source.

Vue 6 186 fois - Téléchargée 396 fois

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

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
6 octobre 2005

Merci
@+
Messages postés
91
Date d'inscription
samedi 8 mars 2003
Statut
Membre
Dernière intervention
5 août 2010

bin voila j'aime beaucoup et c'est propre.
je ne trouve rien a redire.

10/10
++

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.