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 :

protection contre injection sql et xss


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 455
    Points : 109
    Points
    109
    Par défaut protection contre injection sql et xss
    Bonjour,

    Je regarde pour protéger mon site et j'ai mis ces fonctions, je voulais savoir si c'étais bon et bien protégé comme sa.

    En début de chaque page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Contre injection xss et sql
    if(!empty($_POST)){
    	$_POST = sanitize($_POST);
    	$_POST = sanitize_trim($_POST);
    	$_POST = sanitize_strip($_POST);
    }
     
    if(!empty($_GET)){
    	$_GET = sanitize($_GET);
    	$_GET = sanitize_trim($_GET);
    	$_GET = sanitize_strip($_GET);
    }
    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
     
     
    function sanitize($input){
        if(is_array($input)){
            foreach($input as $k=>$i){
                $output[$k]=sanitize($i);
            }
        }
        else{
            if(get_magic_quotes_gpc()){
                $input=stripslashes($input);
            }       
            $output=mysql_real_escape_string($input);
        }   
     
     
    	return $output;
    }
     
     
    function sanitize_trim($input){
        if(is_array($input)){
            foreach($input as $k=>$i){
                $output[$k]=sanitize_trim($i);
            }
        }
        else{      
            $output=trim($input);
        }   
    	return $output;
    }
     
    //contre injection xss
    function sanitize_strip($input){
        if(is_array($input)){
            foreach($input as $k=>$i){
                $output[$k]=sanitize_strip($i);
            }
        }
        else{     
            $output=strip_tags($input);
        }   
    	return $output;
    }
    Merci de votre aide

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    On ne peut pas appliquer ces fonctions de manières systématiques.

    mysql_real_escape_string(), en dehors d'être obsolète, ne sert qu'à l'ajout de données dans une requête SQL ; je suppose que toutes tes données POST et GET ne finissent pas dans une requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    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 un protection un peu lourde ce que tu nous fais là, tu ferais mieux d'utiliser les filtres et les requêtes préparées.

    Exemple:
    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
    <?php
     
    // filtrer & nettoyer les valeurs obtenues
    $data = filter_input_array(INPUT_POST, array(
        'nom'    => FILTER_SANITIZE_STRING,
        'prenom' => FILTER_SANITIZE_STRING,
        'age'    => FILTER_VALIDATE_INT,
        'mail'   => FILTER_VALIDATE_EMAIL,
    ));
     
    // y a t'il des valeurs incorrectes ?
    if ($error_fields = array_keys($data, false, false)) {
     
        // retourner sur le formulaire et afficher les messages d'erreur
        afficher_formulaire($error_fields);
    }
     
    // enregistrer en base (on suppose que $pdo est un objet de la classe PDO)
    $stmt = $pdo->prepare('INSERT INTO users (nom,prenom,age,mail) VALUES (:nom,:prenom,:age,:mail)');
     
    if (!$stmt->execute($data)) {
     
        // erreur d'insertion en base
        afficher_erreur($stmt);
    }
     
    // sortir les données de la base et les afficher
    $stmt = $pdo->query('SELECT nom,prenom FROM user WHERE id=1');
     
    list($nom, $prenom) = $stmt->fetch(PDO::FETCH_NUM) + array('', '');
     
    // nettoyer en sortie
    $nom    = filter_var($nom, FILTER_SANITIZE_SPECIAL_CHARS);
    $prenom = filter_var($prenom, FILTER_SANITIZE_SPECIAL_CHARS);
     
    echo "Bonjour $prenom $nom";

  4. #4
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 455
    Points : 109
    Points
    109
    Par défaut
    Merci de vos réponses.

    On va dire que 90% de mes Post et Get finissent dans une requete si ce n'est plus.

    merci j'ai changé mysql_real_escape_string par real_escape_string

    Par contre si je rajoute les filtres et les requêtes réparées de doit toujours mettre les noms de mes post ou get.

    Ce que je veux c'est que sa nettoie automatiquement les post ou les get

  5. #5
    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
    Ce que je veux c'est que sa nettoie automatiquement les post ou les get
    L'automatisation c'est à fuir en programmation ! Au bout d'un moment, ton programme devient une entité presque vivante, lors qu'il tourne plus personne ne sait ni comment ni pourquoi les données bougent et quand il faut tout démêler c'est un cauchemars. Une politique de sécurité digne de ce nom est spécifique et isolée.

  6. #6
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 455
    Points : 109
    Points
    109
    Par défaut
    Justement j'ai l'impression qu'avec ces fonctions si il y a un problème on sait directement ou aller.

    et sa protège des injection sql et xss.

    désolé j'ai pas compris ce que tu veux dire par:
    Une politique de sécurité digne de ce nom est spécifique et isolée

  7. #7
    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
    ça veut dire que la politique de validation de données doit être encapsulée dans un composant indépendant du reste de l'application et injecté au besoin au niveau des contrôleurs.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    class MonController extends Controller {
     
        public function __construct (Validator $validator) {
            $this->_validator = $validator;
        }
     
        public function monAction ($a, $b, $c) {
            list($a,$b,$c) = $this->_validator->cleanup(compact('a','b','c'));
     
            // ...
        }
    }

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu sais que le champ 'numero' est censé contenir un nombre, donc tu vas appliquer un filtre de nombre dessus, le champ 'courriel' est censé contenir une adresse email, donc un filtre d'email, et ainsi de suite...

    Si tu fais un gros filtre générique appliqué à tous les champs, tu vas de toute façon laisser passer plein de choses dedans pour qu'il fonctionne sur tout et ensuite repasser pleins de filtres spécifiques pour les détails. Autant faire directement des filtres spécifiques bien écrits.

    Pour en revenir à tes fonctions, que se passera-il si tu dois afficher directement la valeur récupérée ? après passage dans escape_string, ça va être moche...
    Et si jamais tu as un champ qui doit faire exactement 7 caractères, les caractères supplémentaires étant des espaces ? un coup de trim et pouf ! ça colle plus.
    Et quid d'un éditeur WYSIWYG ? si tu retires tous les tags, tu perds toutes les balises et donc toute la mise en forme de l'éditeur.

    Bref, mieux vaut gérer les choses au cas par cas.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2011
    Messages : 154
    Points : 282
    Points
    282
    Par défaut
    Et puis c'est pas en protégeant POST et GET que tu protèges toutes les entrées utilisateur... Ça pourrai aussi arriver par les cookies, le user-agent, l'adresse IP, le PUT et j'en oublie certainement. Mettons toi ou un autre dev reprend le site dans qques années, et ajoute du code pompé sur le net qui re-échappe, là c'est la merde le double échappement. Ou alors tu peux vouloir faire des calculs ou des traitement de chaînes sur les input avant insertion tu aura des surprises. Si tu souhaites utiliser des données provenant d'un serveur tiers tu auras aussi une faille.
    C'est pourquoi il est conseillé de se protéger contre les injections SQL à la génération de la requête, et de se protéger du XSS à l'affichage.

Discussions similaires

  1. Protection contre les SQL Injections ?
    Par kedare dans le forum JDBC
    Réponses: 9
    Dernier message: 05/05/2010, 10h42
  2. Script de protection contre l'injection SQL
    Par mabrouk1987 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/12/2009, 08h52
  3. [Sécurité] protections php pour XSS, injections SQL, etc
    Par nintendoplayer dans le forum Langage
    Réponses: 1
    Dernier message: 20/03/2008, 08h57
  4. Formulaire et protection contre injection
    Par Overstone dans le forum Langage
    Réponses: 11
    Dernier message: 09/08/2007, 17h46
  5. [SQL] strpos contre injection sql
    Par sam01 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 20/07/2006, 14h24

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