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 :

Nettoyage $_POST [Sécurité]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut Nettoyage $_POST [Sécurité]
    Bonjour,

    Voici la fonction qui me permet de tester/nettoyer les données qui circule en POST...

    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
     
    function check_post($string) {
     
    	// Récupère une variable externe et la filtre
    	// Supprime les balises, et supprime ou encode les caractères spéciaux.
    	$string = filter_input(INPUT_POST, 'test', FILTER_SANITIZE_STRING); 
     
    	// Convertit tous les caractères éligibles en entités HTML
    	// Supprime les balises HTML et PHP d'une chaîne
    	$string = htmlentities(strip_tags($string));
     
    	// Protection contre les injections MYSQL
    	// Protège une commande SQL de la présence de caractères spéciaux
    	$string = mysql_real_escape_string($string);
    	// Ajoute des slash dans une chaîne si % et _ existe
    	$string = addcslashes($string, '%_');
     
    	return $string;
    }
    Quand pensez-vous ??

    Est-ce que j'ai oublié quelque chose, ou peut on encore sécuriser un peux plus les données $_POST ??

    Merci pour vos conseils et corrections

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Salut,

    En toute franchise, cela part d'une bonne idée pour protéger les données reçu par l'utilisateur... mais cela s'appelle tout simplement réinventer la roue (et pire encore dans la manière dont tu procèdes représente des pertes en perf, mais je vais te décrire ce qui ne va pas ).

    Dans un premier temps tu te sers de la fonction htmlentities(), tous les caractères pouvant être transformés en HTML le seront, alors que htmlspecialchars() te permet d'éviter les caractères éligibles représentants un danger (ce qui est mieux).

    Dans un deuxième temps, toujours avec la même fonction, tu t'apprêtes à stocker une chaine transformée, avec un poids plus élevé dans ta BDD, en faite tu te sers de cette fonction au mauvais moment, elle ne devrait pas se trouver dans ta fonction.

    mysql_real_escape_string() :
    quel horreur cette fonction, tu peux t'en passer si tu utilises mysqli ou PDO.

    addslashes() :

    Bon après je ne vais pas aller plus loin dans le raisonnement, parce que je pense que tu dois déjà bien comprendre ces différents points.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut
    Bon après je ne vais pas aller plus loin dans le raisonnement, parce que je pense que tu dois déjà bien comprendre ces différents points.
    En fait pas trop non


    mysql_real_escape_string() :
    Je vais passer sous une base SQLITE donc je vais maintenant utiliser sqlite_escape_string()Concernant le addslashes() :

    J'échappe le %, qui permet d'éviter d'avoir une injection MySQL; ainsi les injections du type "n'importe quelle chaine qui commence par t" (t%) sont ignorées

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Faire une fonction générique de sécurisation est compliqué.
    Pour bien faire :

    1- Filtre tes données : vérifier que le type de données reçue correspond à ce que tu attends (is_int(), filter_input() ... )

    2- Insertion via requête préparée. Utilise PDO et pas les API vieillissantes. Utilise les requêtes préparées pour insérer les données pour te protéger des injections

    3- Protège l'utilisateur en sortie en filtrant l'affichage via htmlentities/htmlspecialchars.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut
    Bonjour,

    As tu un exemple de script à me fournir pour le point 1 et le 3 stp ?

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $age = intval($_POST['age']
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); // false email invalid , null email vide
     
    if($age && $email)
    {
       //insertion
    }
    3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div> Email : <?=htmlentities($email);?> </div>
    Pour faire simple dans ta base de données tu vas stocker des données brutes mais vérifiées et au moment de l'affichage tu les protège pour éviter les faille xss.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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
    J'ai écrit une fonction qui simplifie le travail: elle fait correspondre des messages d'erreurs (manquant ou invalide) tout en validant un jeu de données (tableau, input_get ou input_post).

    ça pourra sans doute 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;
    }

Discussions similaires

  1. Sécurité des variables _POST
    Par zeushaolin dans le forum Flash
    Réponses: 3
    Dernier message: 24/05/2010, 22h10
  2. La Sécurité dans Access
    Par Maxence HUBICHE dans le forum Sondages et Débats
    Réponses: 81
    Dernier message: 24/06/2007, 01h07
  3. [Sécurité] Nettoyage de données
    Par illimus dans le forum Langage
    Réponses: 14
    Dernier message: 16/06/2006, 08h27
  4. Pb de sécurité
    Par xtrips dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2003, 07h50

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