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

Langage PHP Discussion :

Page blanche après validation


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Points : 6
    Points
    6
    Par défaut Page blanche après validation
    Contexte : un site one page très basique
    problème : le formulaire de contact

    Dans le fichier index.php :
    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
    <div>
        <h2>Contactez-nous</h2>
        <p>Pour toute question, n'hésitez pas à nous contacter !<br/>
        Nous vous répondrons aussi vite que possible...</p>
        <form method="post" action="traitement.php">
            <p>
                <label for="nom">Nom : </label><br/>
                <input id="nom" type="text" name="nom" value="<?php if(isset($nom)) echo $nom; ?>" placeholder="Votre nom"/>
                <span class="error-message"><?php if(isset($erreurnom)) echo $erreurnom ;?><br/>
                <label for="prenom">Prénom : </label><br/>
                <input id="prenom" type="text" name="prenom" value="<?php if(isset($prenom)) echo $prenom; ?>" placeholder="Votre prénom"/>
                <span class="error-message"><?php if(isset($erreurprenom)) echo $erreurprenom ;?>
                <br/>
                <label for="email">Email : </label><br/>
                <input id="email" type="email" name="email"  value="<?php if(isset($email)) echo $email; ?>"  placeholder="Votre adresse email"/>
                <span class="error-message"><?php if(isset($erreuremail)) echo $erreuremail ;?><br/>
                <label for="message">Message :</label><br/>
                <textarea name="message" id="message"><?php if(isset($message)) echo $message; ?>" </textarea>
                <span class="error-message"><?php if(isset($erreurmessage)) echo $erreurmessage ;?><br/>
                <input type="submit" value="Envoyer" />
    <?php
    if(isset($erreur)){ echo "<p>$erreur</p>"; }
    ?>
            </p>
        </form>
    </div>
    Dans le fichier traitement.php :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?php
    if(!empty($_POST)){
    	extract($_POST);
    	$valid = true;
    	if(empty($nom)){
    		$valid=false;
    		$erreurnom="Vous n'avez pas rempli votre nom";
    	}
    	if(!preg_match("/^[a-z0-9\-_.]+-_.]+@[a-z0-9\-_.]+\-_.]+\.[a-z]{2,3}$/i",$email)){
    		$valid=false;
    		$erreuremail="Votre email n'est pas valide";
    	}
    	if(empty($prenom)){
    		$valid=false;
    		$erreurprenom="Vous n'avez pas rempli votre prenom";
    	}
    	if(empty($email)){
    		$valid=false;
    		$erreuremail="Vous n'avez pas rempli votre email";
    	}
    	if(empty($message)){
    		$valid=false;
    		$erreurmessage="Vous n'avez pas rempli votre message";
    	}
     
    	if($valid){
    		$to = "zbim@aol.com";
    		$sujet = $prenom." ".$nom." nous écrit depuis StudioT";
    		if(mail($to, $sujet, $message)){
    			$erreur= "Votre message nous est bien parvenu";
    			unset($nom);
    			unset($prenom);
    			unset($email);
    			unset($message);		}
    		else{
    			$erreur = "Votre mail n'a pas pu être délivré";
    		}
    	}
    }
    ?>
    Je suis actuellement un tuto;
    à ce stade, je devrai avoir les messages d'erreurs généré par le php après vérification ou même l'envoi de mail.
    A la place, je n'ai qu'une page blanche (quand je la ré-actualise, il me demande si je veux ré-envoyer le formulaire, j'imagine qu'il sait qd meme plus ou moins de quoi ça parle).

    Auriez-vous une idée ?

    D'autres questions se posent :
    - quitte à avoir mon index en php, ne pourrais-je pas mettre tous la vérification en php dans cet index (au début), et faire pointer action vers index.php (càd la meme page) ?
    - Dans le cas où la vérification de mes champs est faite en PHP (+ les echo d'erreurs, la conservation des champs remplis par l'utilisateur, etc) qu'apporterai de plus une validation en JS ?

  2. #2
    Membre averti
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Points : 374
    Points
    374
    Par défaut
    attention, l'utilisation de extract() sur $_POST est vivement déconseillée pour des raisons de sécurité (plus d'infos ici http://us1.php.net/manual/fr/functio....extract-notes)
    d'autre part, ce script de mail est vulnérable car aucune vérification n'est effectuée sur les variables $nom, $prenom et $message. d'autre part la variable $email n'est pas utilisée

    le fichier traitement.php ne renvoie aucune valeur, c'est donc normal qu'il retourne une page blanche. les variables utilisées dans un fichier php ne se retrouvent pas dans un autre autrement dit, les valeurs qui sont stockées dans la page traitement.php ne seront jamais vues dans la page index.php

    Pour les deux autres questions :

    - quitte à avoir mon index en php, ne pourrais-je pas mettre tous la vérification en php dans cet index (au début), et faire pointer action vers index.php (càd la meme page) ?
    c'est parfaitement faisable (bien que ça soit plus propre à mon avis de séparer)

    - Dans le cas où la vérification de mes champs est faite en PHP (+ les echo d'erreurs, la conservation des champs remplis par l'utilisateur, etc) qu'apporterai de plus une validation en JS ?
    il faut savoir qu'une validation JS ne peut en aucun cas remplacer la vérification PHP. en rajouter une permet simplement de faire un formulaire plus convivial
    n'oubliez pas de voter si le message vous a aidé


  3. #3
    Futur Membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse,

    Pour ne pas utiliser extract, j'ai modifié comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!empty($_POST)){
    	$nom = stripslashes($_POST['nom']);
    	$prenom = stripslashes($_POST['prenom']);
    	$email = stripslashes($_POST['email']);
    	$message = stripslashes($_POST['message']);
    	$valid = true;
    Par contre je ne vous suis pas à ce niveau :
    ce script de mail est vulnérable car aucune vérification n'est effectuée sur les variables $nom, $prenom et $message. d'autre part la variable $email n'est pas utilisée
    Ce n'est pas ce que je fais là :
    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
    if(empty($nom)){
    		$valid=false;
    		$erreurnom="Vous n'avez pas rempli votre nom";
    	}
    	if(!preg_match("/^[a-z0-9\-_.]+-_.]+@[a-z0-9\-_.]+\-_.]+\.[a-z]{2,3}$/i",$email)){
    		$valid=false;
    		$erreuremail="Votre email n'est pas valide";
    	}
    	if(empty($prenom)){
    		$valid=false;
    		$erreurprenom="Vous n'avez pas rempli votre prenom";
    	}
    	if(empty($email)){
    		$valid=false;
    		$erreuremail="Vous n'avez pas rempli votre email";
    	}
    	if(empty($message)){
    		$valid=false;
    		$erreurmessage="Vous n'avez pas rempli votre message";
    	}
    ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Je viens de trouver une réponse à ma question (niveau sécurité) :
    utilisation de htmlentities(),

  5. #5
    Membre averti
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Points : 374
    Points
    374
    Par défaut
    dans le code donné, le seul test qui est effectué est l’existence des variables (sauf pour le mail)
    prenons l'exemple du nom : si l'utilisateur rentre un espace dans la case nom, la variable existe mais ce n'est pas un nom valide. un nom est composé uniquement de lettres, espaces et traits d'union et on peut penser que le nom fait entre 3 et 30 caractères. on peut donc faire cette validation :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match('/^[a-zA-Z\-\ ]{2,30}$/', $_POST['nom']))
      $nom = $_POST['nom'];
    else
      $valid = false;

    je décortique le code :
    preg_match fait une vérification avec une regexp et renvoie true si c'est validé, false sinon
    la regexp valide uniquement les chaines de 2 à 30 caractères uniquement en majuscules, minuscules, traits d'union et espace.
    si c'est valide, on stocke le nom sinon on met $valid à false

    il suffit de faire la même chose sur le prénom et ces deux champs seront protégés (pas besoin de htmlentities)
    pour le contenu, il faut effectivement faire un htmlentities mais aussi vérifier la longueur minimale de la chaine et en fixer une puis la vérifier avec strlen
    n'oubliez pas de voter si le message vous a aidé


  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    si l'utilisateur rentre un espace dans la case nom, la variable existe mais ce n'est pas un nom valide
    Pauvre Charles De Gaulle qui n'a pas le droit de s'inscrire sur tes sites...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre averti
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Points : 374
    Points
    374
    Par défaut
    meuh non ^^ je disais un espace tout seul sans rien d'autre
    n'oubliez pas de voter si le message vous a aidé


Discussions similaires

  1. Réponses: 11
    Dernier message: 04/06/2008, 10h10
  2. Page blanche après traitement PHP
    Par undercrash dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2008, 02h01
  3. [phpMyAdmin] Page blanche après l'installation
    Par Leobaillard dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 20/02/2008, 08h43
  4. Page blanche après un environnement multicolonne
    Par michaeljeru dans le forum Mise en forme
    Réponses: 4
    Dernier message: 03/05/2007, 12h44
  5. Génération d'une page blanche après la première page
    Par le_tisseur dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 08/09/2006, 16h19

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