Faille XSS - Protéction ne fonctionne pas

Résolu/Fermé
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - Modifié par blackbutterfly le 15/05/2012 à 14:57
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - 15 mai 2012 à 16:29
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."
A voir également:

7 réponses

SlyK Messages postés 854 Date d'inscription vendredi 11 mars 2011 Statut Contributeur sécurité Dernière intervention 6 octobre 2014 147
15 mai 2012 à 15:00
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
15 mai 2012 à 15:05
Il passe toujours :/
0
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
Modifié par blackbutterfly le 15/05/2012 à 15:08
Dans la base il est enregistré comme ceci :
&ltscript type=&quottext/javascript&qu  

Je comprend pas
0
Utilisateur anonyme
15 mai 2012 à 15:15
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
Modifié par blackbutterfly le 15/05/2012 à 15:24
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
15 mai 2012 à 15:26
J'ai aussi failli mettre adslashes() mais, j'aimerais avant que ça fonctionne ..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
15 mai 2012 à 15:45
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
Modifié par blackbutterfly le 15/05/2012 à 15:48
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
Utilisateur anonyme
15 mai 2012 à 16:09
$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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
15 mai 2012 à 16:16
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
15 mai 2012 à 16:22
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
Utilisateur anonyme
15 mai 2012 à 16:27
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
blackbutterfly Messages postés 95 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 29 mai 2012 1
Modifié par blackbutterfly le 15/05/2012 à 16:30
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