<?php
/**
* @file jeton_formulaire.php
* @brief Page qui empêche le repost de formulaire par F5
*
* @author hughes monget
* @see http://monget.com
*/
session_start();
//unset($_SESSION['formulaire']);
// Récupération ou création de la liste des jetons.
// Attention: sur un site, il faut changer de nom de variable de
// session pour chaque formulaire.
if (isset($_SESSION['formulaire']))
{ $arr_int_jeton = unserialize($_SESSION['formulaire']); }
else
{ $arr_int_jeton = array(); }
// Création du jeton courant.
$int_jeton = count($arr_int_jeton);
// On l'ajoute à la liste en le marquant inutilisé.
$arr_int_jeton[] = FALSE;
// Pour la gestion des messages à l'utilisateur.
$arr_str_message = array();
// Test si le formulaire est posté.
if (isset($_REQUEST['bouton']))
{
$arr_str_message[] = 'POST';
// Test si le jeton est correct et qu'il n'a pas déja été utilisé.
if (!isset($_REQUEST['jeton']) || !ctype_digit($_REQUEST['jeton'])
|| !isset($arr_int_jeton[$_REQUEST['jeton']])
|| $arr_int_jeton[$_REQUEST['jeton']])
{
// Problème avec le jeton.
$arr_str_message[] = 'FORMULAIRE DEJA POSTE OU ERREUR';
}
else
{
// Traitement du formulaire
$arr_str_message[] = 'FORMULAIRE TRAITE';
// On marque le jeton comme utilisé.
$arr_int_jeton[$_REQUEST['jeton']] = TRUE;
}
}
// On stocke la liste (à jour) des jetons.
$_SESSION['formulaire'] = serialize($arr_int_jeton);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Anti-repost de formulaire via un mécanisme de jeton</title>
<style type="text/css">
<!--
-->
</style>
<script type="text/javascript">
<!--;
//-->
</script>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
<!-- A mettre en hidden -->
<input type="text" name="jeton" value="<?php echo $int_jeton ?>" />
<input type="submit" name="bouton" value="Go Go Go" />
</form>
<?php
if ($arr_str_message)
{
echo '<pre>'.implode("\n", $arr_str_message).'</pre>';
}
echo '<hr />';
highlight_file(__FILE__);
?>
</body>
</html>