IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Formulaire et rechargement de page


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 94
    Par défaut Formulaire et rechargement de page
    Bonjour à tous !

    Je viens vers vous car je développe actuellement une application web, et je rencontre un problème plutôt embêtant.

    En effet, dans une même page, j'ai un formulaire d'ajout et la liste des données présentes. Et lorsque j’effectue un ajout, les données sont ajoutés sans problèmes, mais lorsque je recharge la page, les données sont re-envoyées...


    Après quelques recherche, la solution serait de séparer le formulaire de la liste, mais je ne veux vraiment pas pour des raisons esthétiques...

    Une solution? Merci !

  2. #2
    Membre confirmé
    Femme Profil pro
    Etudiante en informatique
    Inscrit en
    Janvier 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 98
    Par défaut
    D'une façon générale, lorsque tu actualises la page (F5) tu renvoies les données du formulaire. Du coup l'ajout s'effectue deux fois.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    voici une technique pour empêcher le renvoi du formulaire par actualisation (Formulaire et Traitement sur la même page) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php if(session_id()=='') { session_start(); }
    // TRAITEMENT SI LE FORM A ETE POSTE
    if (isset($_SESSION['random_OK'], $_POST['randomformOK'])
    	&& $_POST['randomformOK']==$_SESSION['random_OK']) {
    	include('./form-traiter.php'); // traitement...
    }
    // Protection contre "actualiser la page" ou envoi depuis l'extérieur (vol de formulaire)
    unset($_POST);
    $_SESSION['random_OK'] = rand(100000,999999); // nombre aléatoire
    // -----------------------
    // AFFICHAGE DU FORMULAIRE
    ?>
    	<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    		<input type="hidden" name="randomformOK" value="<?php echo $_SESSION['random_OK']; ?>" />
    	..........
    	</form>
    • $_SESSION['random_OK'] contient un nombre aléatoire
    • il est mis dans un input hidden du formulaire => il sera alors récupéré via $_POST['randomformOK']


    SI on recharge la page (F5):
    • $_SESSION['random_OK'] est modifié
    • MAIS $_POST['randomformOK'] NON.

    Ils sont différents => le traitement ne se fait pas (une 2ème fois).
    Dernière modification par Invité ; 16/07/2018 à 11h36.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Par défaut
    Plus simple, tu mets à la fin de ton enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    header('Location: pageDuFormulaire.php');
    exit;
    et plus de problème.

  5. #5
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bonjour Clebit,

    La solution de jreaux62 a le double avantage de :
    - UN : empêcher que les informations soumises au serveur viennent d'un formulaire différent de celui afficher par ce serveur (tentative de piratage)
    - DEUX : empêcher, indirectement, le double envoi des informations par la touche F5.

    Cette protection par chiffre aléatoire vise à contrer ce que l'on appelle : faille CSRF. Je t'invite à te documenter dessus c'est très intéressant.

    Enjoy

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Par défaut
    Effectivement, cela ralentirait une attaque sans la bloquer. Rajouter $_SERVER['HTTP_REFERER'] permettrait de compliquer la tâche.

    Mais en mettant le header location, cela évite le message "Renvoyer les données... " et est compatible avec le script.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Clebit Voir le message
    ..., cela ralentirait une attaque sans la bloquer...
    Il ne faut pas tout mélanger.

    Il ne s'agit pas de bloquer une attaque, et ça ne remplace pas les vérifications des champs reçus.

    Rappel : Formulaire et Traitement sur la même page
    Comment penses-tu que header('location...') va réagir alors qu'on est ici sur une seule et même page ?
    Une boucle infinie !

    Formulaire et Traitement sur la même page permet, en outre, de pouvoir afficher les messages d'erreur ou de validation, ré-afficher le formulaire avec les données pré-remplies...
    Le header('location...'), non.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    Il ne faut pas tout mélanger.
    Je mélange rien, je répondais des à Njörd sur les attaques de type Cross-Site Request Forgery.

    Citation Envoyé par jreaux62 Voir le message
    Rappel : Formulaire et Traitement sur la même page
    Comment penses-tu que header('location...') va réagir alors qu'on est ici sur une seule et même page ?
    Une boucle infinie !
    Je n'ai pas oublié, et m'a solution est fonctionnelle. Tu peux tester l'exemple ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
    session_start();
     
    if(isset($_POST['exemple'])){
    	//s'il y a un post, on enregistre
     
    	//vu que tu veux réafficher la saisie, on met en post
    	//perso, je contrôle d'abors en javascript, ce qui permet d'économiser des ressources serveur
    	$_SESSION['post'] = $_POST;
     
    	//et on redirige SUR LA MEME PAGE
    	header("location:exemple.php");
    	exit;
    }
    ?>
    <html>
    <head>
    </head>
    <body>
    	<form action="exemple.php" method="post">
    		<input type="input" name="exemple" value="<?php echo isset($_SESSION['post']['exemple']) ? $_SESSION['post']['exemple'] : ''; ?>" />
    		<input type="submit" name="Test" />
    	</form>
    </body> 
    </htlm>

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Par défaut
    J'avoue que je suis un peu perdu, peux-tu m'expliquer en quoi je mélange?

    Ensuite, mon exemple reste sur une seule page de code ce qui répond à la demande de Kalas22. La où ma solution fait la différence, c'est qu'il n'y a plus le message du navigateur "Voulez-vous renvoyez les données..." lorsque l'on actualise ou utilise les flèches pages précédentes et suivantes. Ce qui évite d'inquiéter l'utilisateur moyen et est plus ergonomique.

    Ensuite, tu utilises également les sessions. Moi je les utilises uniquement pour correspondre à ta demande de les ré afficher dans le formulaire mais elles ne sont pas obligatoires.

Discussions similaires

  1. Verifier valeur d'un formulaire sans recharger la page
    Par afrodje dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/02/2009, 16h17
  2. [AJAX] soumission d'un formulaire sans rechargement de page?
    Par coupolites dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/08/2008, 10h07
  3. [AJAX] Transmettre un formulaire sans rechargement de page
    Par micka39 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 21/11/2007, 12h20
  4. [AJAX] Remplir un formulaire sans recharger la page
    Par houdazcom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2007, 12h37
  5. bouton formulaire qui recharge la page mere
    Par BernardT dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/06/2006, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo