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 :

Créer une fonction pour filtrer un formulaire


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut Créer une fonction pour filtrer un formulaire
    Bonjour,

    Je débute avec les fonctions et j'aimerais un exemple adapté à mon problème.
    Voilà, j'ai une dizaine de pages qui utilisent ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $titre=htmlspecialchars(mysql_real_escape_string($_POST['titre']));
    $contenu=htmlspecialchars(mysql_real_escape_string($_POST['contenu']));
    L'idée serait bien sûr de créer une fonction dans un fichier qui serait inclu dans toutes les pages, puis d'appeler ladite fonction à l'endroit voulu, dans chaque page.

    Mais ma compréhension de la chose s'arrête là. Bien sûr j'ai lu les cours, mais je voudrais un exemple concret, pour commencer.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Déjà, les deux fonctions ne vont pas ensemble :

    mysql_real_escape_string sert à l'utilisation d'une donnée externe dans une requête avec l'ancien driver mysql_
    htmlspecialchars sert à l'affichage de données externes dans du HTML.

    Ces deux fonctions ayant un usage spécifique, il n'y a pas de raison de généraliser leur utilisation à toutes les pages.

    Après disons que si avant d'éxécuter une requête tu veux échapper toutes tes variables de formulaire, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_POST = array_map('mysql_real_escape_string', $_POST);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Salut sabotage, merci pour ta réponse.
    Mes scripts datent de plus de 5 ans, j'ai peut être beson de me remettre à jour question sécurité. J'ai toujours utilisé les fonctions ci-dessus mais bon... Qu'est-ce que cette hitoire d'ancien driver sql ? Qu'est-ce que ça change ? Ca date de quand ? On ne peut plus utiliser mysql_real_escape_string ? C'est quoi la nouvelle fonction ?
    Et pour html_special_chars alors ? Il me faut une fonction qui filtre les caractères spéciaux. Si j'utilise htmlentities à la place, de mémoire ça me fait plein de caractères crades dans la base de données.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Par défaut
    Si tu as PHP 5.2, cette fonction peut t'aider à filtrer les données utilisateur:
    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;
    }
    Elle permet de filtrer d'un coup tous les inputs utilisateurs et renvoie les messages d'erreurs pour les données manquantes ou invalides. Tout est expliqué dans la description.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Holala... C'est affreusement compliqué, j'ai l'impression de repartir 5 ans en arrière quand j'apprenais à coder. Cela fait 2 ans que je n'ai pas codé, et je découvre des fonctions que je n'avais jamais vues...

    Qu'est-ce que ce : FILTER_SANITIZE_STRING par exemple ? Ca a été ajouté quand dans php ?
    Si ce sont de nouvelles fonctions, il me faudrait un guide pour m'y retrouver dans les nouveautés php de ces dernières années. Parce qu'à vous lire les mysql_real_escape_string et autre htmlspecialchars ne sont plus d'actualité et en les utilisant, je risque désormais de me faire pirater.

    **edition **
    Faut-il désormais utiliser ces fonctions ? http://php.net/manual/en/filter.filters.sanitize.php

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Par défaut
    En effet, désormais l'API des filtres à supplanté les mécanismes traditionnels d'échapement de données et PDO (ou mysqli) avec les requêtes préparées rend inutile mysql_real_escape_string.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    En effet, désormais l'API des filtres à supplanté les mécanismes traditionnels d'échappement de données
    ??

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    La documentation t'indiquera les fonctions obsolètes.
    Toute la série mysql_ est obsolète mais elle n'est pas moins sécurisée que ses successeurs.

    htmlspecialchars et htmlentities sont toujours valables, il faut juste les utiliser à bon escient.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    HeM... Bon il faut que j'approfondisse tout ça.

    Donc a priori, donc a priori, dans mon cas ça donnerait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titre= filter_input(INPUT_POST, 'titre', FILTER_SANITIZE_SPECIAL_CHARS);
    Ca c'est pour filtrer les caractères spéciaux et ça remplace le vieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titre=html_special_chars($_POST['titre']).
    J'ai bon ?

    Et pour remplacer mysql_real_escape_string, j'utilise quoi alors comme filter_sanitize ? FILTER_SANITIZE_STRING, c'est ça ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une fonction pour le max de jours d'un mois..
    Par kim mading dans le forum WinDev
    Réponses: 4
    Dernier message: 05/10/2012, 14h51
  2. [OpenOffice][Base de données] créer une fonction publipostage dans un formulaire
    Par micker dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 08/09/2009, 13h50
  3. Créer une fonction pour remplacer des caractères
    Par virtuadrack dans le forum C++
    Réponses: 4
    Dernier message: 11/09/2008, 15h52
  4. Créer une fonction pour un update avec phppgadmin
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 19/06/2008, 12h56
  5. [AJAX] Une fonction pour poster un formulaire?
    Par Mysti¢ dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 19h28

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