Faille XSS - Protéction ne fonctionne pas

Résolu
Bonjour,

J'ai lu recement que pour palier aux attaques XSS il fallait utiliser les fonctions : htmlentities() et htmlspecialchars()

donc quand je fais cela :
------ Récupération d'un formulaire à la c*** ----  
$_POST['blabla'] ( contient : <script type="text/javascript">alert('bonjour')</script> )  
$EBla = htmlentities($_POST['blabla']);  
$bla = htmlspecialchars($EBla, ENT_QUOTES);   
---- Insertion dans la base ---  


Pourquoi il me fait quand même l'alert ?

Voici quelques test que j'ai fais en plus :
$pre = "<Méridith collin's>";  
$Epre = htmlentities($pre);  
echo "html entities : $Epre <br />"; // Affiche : html entities : <Méridith collin's>   
$Fpre = htmlspecialchars($Epre, ENT_QUOTES);  
echo "html specialchar : $Fpre <br />"; // Affiche : html specialchar : &ltM&eacuteridith collin's&gt
$test = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);  
echo ($test); // Affiche : <a href='test'>Test</a>  


Quelqu'un aurait une idée ? Les données dans ma base sont confidentiel et donc je n'ai pas envie que quelqu'un s'amuse à s'introduire dedans ..

Je vous remercie d'avance. Cordialement



"Le hasard n'existe pas, tout est inéluctable."

7 réponses

  1. Contributeur sécurité
    Hello,

    Test ceci:
    $bla = htmlentities(htmlspecialchars($_POST['blabla']));

    Quand tu récupères les données depuis la BDD passe par cette fonction aussi : html_entity_decode.

    @+
    0
    1. Il passe toujours :/
      0
      1. Dans la base il est enregistré comme ceci :
        &ltscript type=&quottext/javascript&qu  
        

        Je comprend pas
        0
    2. Bonjour

      Ce que tu décris pour tes tests en plus est parfaitement normal.

      Par contre, pour ton problème initial, il nous manque des informations essentielles :
      Comment insères-tu les données dans la base ?
      Comment les extrais-tu ?
      Comment affiches-tu les données extraites ?
      0
      1. Donc je récupère les données via un form ( jusque là je ne vous apprend rien ( rire ) )
        Ensuite je traite les données comme cela :
        if (isset($_POST['Add']))  
           { 
                 if (  $_POST['organisateur']  != null) 
                 { 
                       htmlentities($_POST['organisateur'], ENT_QUOTES); 
                       htmlspecialchars($_POST['organisateur'], ENT_QUOTES); 
                       $user = new MUser; 
                       $add = $user->adduser($_POST['organisateur']); 
        

        Bon j'ai 9 $_POST donc en gros c'est toujours la même ...
        après j'utilise un fonction PDO de se genre :
         public function Add_Member ($organisateur) 
         { 
           // On se connecte à MySQL 
           $bdd = new PDO('mysql:host=localhost;dbname=test', 'root@localhost', ''); 
            
           //Utilisation de la requête générant les tuples 
           $reponse = $bdd->prepare("INSERT INTO USER (BOITE) 
           VALUES (?)"); 
        
           $reponse->execute(array($organisateur)); 
            
           // Termine le traitement de la requête 
           $reponse->closeCursor(); 
           
        } 
        


        et j'obtiens le même résultat avec ce que m'a dit de faire sylk.

        Pour les extraire, je fais un fetch() ou fetchAll() ( tout dépend la table ) et donc un echo pour afficher.
        "Le hasard n'existe pas, tout est inéluctable."
        0
        1. J'ai aussi failli mettre adslashes() mais, j'aimerais avant que ça fonctionne ..
          0
      2. htmlentities($_POST['organisateur'], ENT_QUOTES);   
                       htmlspecialchars($_POST['organisateur'], ENT_QUOTES); 

        Ces instructions-là ne font rien du tout ! Elles calculent des valeurs, mais ne les remettent pas dans les variables !!! Ce n'est pas ce que tu avais dit au départ !
        Quant à ton adduser, on ne sait pas ce qu'il fait.

        C'est déjà une aberration de faire htmlentities et htmlspecialchars à l'enregistrement des informations, ça n'a d'utilité que lors de l'affichage, mais passons.
        htmlentities(htmlspecialchars($_POST['blabla'])); comme SlyK te l'a dit est correct, mais il reste à voir comment tu fais l'affichage.

        J'ai aussi failli mettre adslashes Effectivement, pour protéger l'insertion des données dans la base, le mieux est d'utiliser la fonction "faite pour" : mysql_real_escape_string (qui ressemble à addslashes) si ta base est mysql. Mais ne mélangeons pas tout.
        0
        1. oui je m'excuse j'ai tapé rapidement
          techniquement je fait cela :
          $Eboite = 	htmlentities($_POST['organisateur'], 	ENT_QUOTES);
          $boite 	= 	htmlspecialchars($_POST['organisateur'], 	ENT_QUOTES);
          et après l'insertion de $boite
          

          Donc ces fonctions sont pour après l'insertion ? à l'affichage je veux dire.
          Je m'excuse mais, je viens de les découvrir donc d'après la doc php, c'est vraiment spécifié avec l'utilisation d'une BDD
          Je n'utilise pas les mysql_ toutes mes fonction sont en PDO.

          Si j'ai bien compris :
          Avant l'insertion je ne fais que des addslashes et pour l'affichage les deux autres ?
          0
        2. Et add_user c'est add_member en gros. j'ai tout tapé sans C/P sauf la fonction d'ajout d'où le changement de nom. doc php n'est pas spécifié pour la bdd ( il faut que je me relise avant de poster )
          ( Encore désolé )
          0
      3. $Eboite = 	htmlentities($_POST['organisateur'], 	ENT_QUOTES);
        $boite 	= 	htmlspecialchars($_POST['organisateur'], 	ENT_QUOTES);

        la première ligne ne sert à rien, tu repars de $_POST['organisateur'] pour la seconde...
        Si derrière tu fais un html_entity_decode pour afficher, c'est comme si tu n'avais rien fait du tout !

        je viens de les découvrir donc d'après la doc php, c'est vraiment spécifié avec l'utilisation d'une BDD
        Peux-tu me dire où tu as vu ça ? En tous cas, pas pas à la page sur htmlentities http://www.php.net/manual/fr/function.htmlentities.php
        ni celle sur htmlspecialchars http://www.php.net/manual/fr/function.htmlspecialchars.php.

        Si tu utilises PDO, tu n'as besoin de rien de particulier pour protéger tes données lors de l'insertion, si tu utilises des requêtes avec paramètres. C'est l'un des intérêts de PDO d'ailleurs.

        Pour l'affichage, htmlspecialchars suffit, ou htmlentities si tu préfères, mais surtout pas l'enchaînement des deux (sauf si tu as bien compris leurs rôles, sinon l'affichage risque de ne pas être ce que tu attends)
        0
        1. je viens de les découvrir donc d'après la doc php, c'est vraiment spécifié avec l'utilisation d'une BDD   
          doc php n'est pas spécifié pour la bdd ( il faut que je me relise avant de poster ) 


          Donc si j'ai bien compris : Je fais un addslashes() de mes valeurs avant de les mettres dans ma base, et quand je veux les afficher je fais l'une des deux.
          Si je veux afficher le prénom ( exemple : Méridith ) il faut que j'utilise htmlentities() si j'ai bien compris.
          Cela comblera donc la faille ?
          0
        2. En effet cela fonctionne. Merci beaucoup.
          Je m'excuse du temps qu'il a fallu pour que cela monte au cerveau.

          Merci à vous deux.

          Cordialement
          0
      4. Il y a deux problèmes qui n'ont aucun rapport entre eux :
        Celui de l'insertion dans la base de données. Tu peux avoir besoin ou non de addslashes, ça dépend de comment tu fais l'insertion des données. Si c'est avec une requête préparée avec des paramètres, PDO se charge de la protection et tu n'as rien à faire. Si c'est toi qui crées la chaîne de requête complète, il faut protéger les données avec addslashes.

        Deuxième problème, celui de la faille XSS, qui apparaît quand tu crées le code de ta page HTML avec des données qui contiennent un script. Sans précautions, la balise <script> sera insérée telle quelle dans ta page, et donc exécutée. Mais si tu utilises htmlentities , le < sera remplacé par & lt;. Il n'y aura donc plus de balise <script mais l'affichage du caractère <.
        0
        1. Merci beaucoup pour les informations. Je comprend mieux maintenant pourquoi on ma dit de tout faire en PDO ( rire ). Encore merci. Maintenant, je m'attaque à salt :)
          0