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 :

Validation de formulaire


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 116
    Points : 48
    Points
    48
    Par défaut Validation de formulaire
    Bonjour à tous

    J'essaye d'implémenter un formulaire sur un site afin de recueillir des informations sur les visiteurs.
    J'ai essayé de mettre en place un système de vérification avant l'envoie du formulaire, d'après les différents tutos et lexique je pense que mon code est + ou - bon.
    Mais malheureusement il ne fonctionne pas.
    Si au premier coup d’œil vous voyez l'erreur, je vous en serai très reconnaissant.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <!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" xml:lang="fr" lang="fr">
    <head>
    <meta http-equiv="Content-Type" content="text/plain; charset=UTF-8" />
    </head>
    <?PHP
    if (get_magic_quotes_gpc())
    {
        $nom = stripslashes($_POST['nom']); 
        $email = stripslashes($_POST['email']);
        $nation = stripslashes($_POST['nation']); 
        $prenom = stripslashes($_POST['prenom']); 
        $telephone = stripslashes($_POST['telephone']); 
        $adresse = stripslashes($_POST['adresse']);
        $profession = stripslashes($_POST['profession']); 
        $statut = stripslashes($_POST['statut']); 
        $interet = stripslashes($_POST['interet']);
        $message = stripslashes($_POST['message']);  
    } 
    else
    {  
        extract($_POST,EXTR_OVERWRITE); 
     
    $to = 'chezmoi@monsite.com';
     
    // Subject
    $subject = 'Demande informations concernant monsite.com';
    /////voici la version Mine 
    $headers = "MIME-Version: 1.0\r\n"; 
     
    $headers .='Content-Type: text/plain; charset="utf-8"'." ";
    $headers .='Content-Transfer-Encoding: 8bit'; 
    /* Construction du message */
    $msg  = 'Bonjour,'."\r\n\r\n";
    $msg .= 'Ce mail a été envoyé depuis le site monsite.com par '.$nom.' '.$prenom."\r\n\r\n";
    $msg .= 'Voici le message qui vous est adressé:'."\r\n";
    $msg .= '***************************'."\r\n";
    $msg .= 'Le nom est :'.$nom."\r\n\r\n";
    $msg .= 'Le prénom est :'.$prenom."\r\n\r\n";
    $msg .= 'La nationalité est :'.$nation."\r\n\r\n";
    $msg .= 'Le numéro de téléphone est :'.$telephone."\r\n\r\n";
    $msg .= 'L adresse email est :'.$email."\r\n\r\n";
    $msg .= 'L adresse de domiciliation est :'.$adresse."\r\n\r\n";
    $msg .= 'Sa profession est :'.$profession."\r\n\r\n";
    $msg .= 'Son statut est :'.$statut."\r\n\r\n";
    $msg .= 'Son intérêt est :'.$interet."\r\n\r\n";
    $msg .= 'Son message est :'.$message."\r\n\r\n";
    $msg .= '***************************'."\r\n\r\n";
     
     
    $headers = 'From: '.$nom.' '.$prenom.' <'.$expediteur.'>'."\r\n\r\n";
    $champs_obligatoires = Array('nom', 'email', 'nation', 'prenom', 'telephone', 'adresse', 'profession');
    function verif_champs_obligatoires($array) {
      foreach ($array as $nom) {
       if (empty($_POST[$nom])) {
         return false;
       }
      }
      return true;
    }
    if (!empty($_POST)) {
      if (verif_champs_obligatoires($champs_obligatoires) === true) {
      mail($to, $subject, utf8_decode($msg), utf8_decode ($headers));
      } else {
       $error = 'Merci de remplir tous les champs';
      }
    }
     
    // la fonction de redirection ------------
    function redir($url){
    echo "<script language=\"javascript\">";
    echo "window.location='$url';";
    echo "</script>";
    }
    // Utiliser la redirection ---------------
    redir("http://www.monsite.com"); 
    }?> 
    </html>
    Je vous remercie d'avance pour votre aide, très bonne journée à tous

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extract($_POST,EXTR_OVERWRITE);
    Elle est là l'erreur: t'as rien trouvé de plus dangereux que ça ?
    ça revient à mettre la directive register globals à ON (ce qu'il ne faut surtout jamais faire).

    Pour valider ton formulaire voici une fonction qui peut t'aider:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    /**
     * @brief Generic validation function
     * 
     * This function takes an input (either an INPUT_* integer or an associative array) and a required structure to filter
     * against and computes error messages (if any).
     * @c $structure parameter is described as follow 
     * @code
     * $structure = array(
     * 'a' => array(
     *    'filter' => FILTER_VALIDATE_INT,
     *    'missing' => 'A is missing',
     *    'invalid' => 'A is invalid',
     *   ),
     *   'b' => array(
     *    'filter' => FILTER_SANITIZE_STRING,
     *    'missing' => 'B is missing',
     *    'invalid' => 'B is invalid',
     *   ),
     *   'c' => array(
     *    'filter' => FILTER_VALIDATE_EMAIL,
     *    'missing' => 'C is missing',
     *    'invalid' => 'C is invalid',
     *   ),
     * );
     * @endcode
     *  
     * @param integer|array $input The input to validate, can be either INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, 
     * INPUT_ENV or an associative array
     * @param array $structure The filter structure, optionnaly padded with error messages
     * @param array (out) $messages Error messages fetched from missing or invalid entries in $structure array 
     * @param boolean $silent @optional @default{false} If set to true, will not throw errors when the 'filter' parameter
     * is missing 
     * @throws RuntimeException If used with PHP < 5.2
     * @throws InvalidArgumentException If a parameter is invalid
     */
    function validate ($input, array $structure, array & $messages = null, $silent = false) {
        if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50200)
            throw new RuntimeException(__FUNCTION__ . " requires PHP 5.2 or higher");
     
        if (empty($structure))
            throw new InvalidArgumentException("Structure paramter is empty");
     
        if (is_int($input) && !in_array($input, array(INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV)))
            throw new InvalidArgumentException(
                "Input parameter must be one of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV");
        elseif (is_int($input))
            $validate = 'filter_input_array';
        elseif (is_array($input))
            $validate = 'filter_var_array';
        else
            throw new InvalidArgumentException(
                "Input parameter is expected to be integer or array," . gettype($input) . "given");
     
        $filter           = array();
        $messages_missing = array();
        $messages_invalid = array();
        foreach ($structure as $key => $value) {
            if (isset($value['filter'])) {
                $filter[$key] = $value['filter'];
            }
            else {
                !$silent && trigger_error("No filter specified for $key, using FILTER_UNSAFE_RAW", E_USER_WARNING);
                $filter[$key] = FILTER_UNSAFE_RAW;
            }
            if (isset($value['missing'])) $messages_missing[$key] = $value['missing'];
            if (isset($value['invalid'])) $messages_invalid[$key] = $value['invalid'];
        }
     
        if (!$data = $validate($input, $filter))
            return $data;
     
        $messages  = array();
        $messages += array_intersect_key($messages_invalid, array_flip(array_keys($data, false, true)));
        $messages += array_intersect_key($messages_missing, array_flip(array_keys($data, null,  true)));
        return $data;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 116
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup pour ton aide je viens de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else
    {  
        extract($_POST,EXTR_OVERWRITE);
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    else
    {  
        $nom = $_POST['nom'];
        $email = $_POST['email'];
        $nation = $_POST['nation']; 
        $prenom = $_POST['prenom']; 
        $telephone = $_POST['telephone']; 
        $adresse = $_POST['adresse'];
        $profession = $_POST['profession']; 
        $statut = $_POST['statut']; 
        $interet = $_POST['interet'];
        $message = $_POST['message'];
    je te remercie également pour ta proposition de validation, je vais essayé d'étudier un peu le contenu.

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est pas bon non plus car tu ne valide ni la présence ni la validité des paramètres que tu réccupères sur $_POST. Si tu ne valide pas au moins la présence, à chaque donnée manquante tu auras une erreur.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 116
    Points : 48
    Points
    48
    Par défaut
    Je te remercie pour ton aide.
    Comme tu as du le deviner je ne suis pas vraiment une flèche en php.
    Je vais profiter de tes conseils pour faire quelques recherches sur ce point.

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pas de souci, on est là pour ça

    Pour la petite histoire, si beaucoup d'entre nous sont aussi inflexibles sur la validation des données c'est parce que l'absence de validation est la source de nombreux problèmes de sécurité comme les injections SQL ou les attaques XSS qui conduisent à des vols de données ou à compromettre la sécurité de tes utilisateurs.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 116
    Points : 48
    Points
    48
    Par défaut
    Bonjour à tous,
    Suite aux conseils de Benjamin Delespierre, j'ai fais des recherches sur la sécurité de mon formulaire.
    D'après quelques sources, si je mets en début de 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
     
    function XSS_filter() {
    $neutralChar = '_';
    $forbiddenList = array(0 => "<", 1 => ">");
     
    $listVar = & $GLOBALS[("_" . $_SERVER['REQUEST_METHOD'])];
     
    foreach(array_keys($listVar) as $key){
    foreach($forbiddenList as $forbidden){
    if(stristr($listVar[$key], $forbidden))
    $listVar[$key] = str_replace($forbidden, $neutralChar, $listVar[$key]);
    }
    }
    }
    apparemment ça règle quelques problèmes de sécurité.

    J'attends avec impatience vos avis et commentaires.
    Merci d'avance pour votre aide, très bonne journée à tous

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    & $GLOBALS[("_" . $_SERVER['REQUEST_METHOD'])]
    Tu devrais plutôt utiliser $_REQUEST

    Et ton filtre XSS peut se résumer à un strip_tags:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $params = array_map('strip_tags', $_REQUEST); // applique le filtre strip_tags à tous les éléments de $_REQUEST
    De plus, tu n'as pas besoin de faire la vérification si le caractère existe ou pas pour faire un remplacement avec str_replace, s'il est absent aucun remplacement ne sera fait.
    Enfin, str_replace accepte des tableaux en recherche et remplacement, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $search = array('foo','bar');
    $replace = array('hello','peter');
     
    echo str_replace($search,$replace, "I say foo bar"); // I say hello peter
    Donc pas besoin de boucler sur les caractères à rechercher.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 116
    Points : 48
    Points
    48
    Par défaut
    Encore merci pour ton aide,
    Mon niveau en php ne me permet pas encore de bien comprendre toutes les subtilités des fonctions.

    Je vais bosser tes conseils
    Merci

Discussions similaires

  1. validation du formulaire de la page ouvrante d'un popup
    Par noa dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/08/2005, 12h11
  2. Réponses: 5
    Dernier message: 24/05/2005, 11h21
  3. Valider un formulaire contenu dans une iframe
    Par snoopy5.0 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2005, 11h14
  4. Valider un formulaire par une image
    Par Fleep dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 31/10/2004, 01h50
  5. [Struts]Validation de formulaire
    Par djoukit dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/03/2004, 09h12

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