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 :

textarea et faille xss [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut textarea et faille xss
    Bonjour,
    la question est simple : "comment se protéger des failles xss sur un texarea ?"
    On vient de me faire remarquer, très justement, qu'un de mes scripts avait une faille xss. (merci stealth35)

    Je protège la récupération de mes données issues d'un formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    	// recuperation
    	$from_input 	= htmlspecialchars(stripslashes(trim($_POST['from_input'])));
    	$from_textarea 	= stripslashes(trim($_POST['from_textarea']));
    	// avant passage en bdd : protection contre injection sql
    	$from_input 	= mysql_real_escape_string($from_input);
    	$from_textarea 	= mysql_real_escape_string($from_textarea);
    ?>
    On a aussi :
    - Sanitize filters
    - filter_input

    Mais je n'ai pas trouvé de solution contre les failles xss pour un textarea, qui, par définition, doit pouvoir enregistrer et afficher des balises html.

    D'après ce que j'ai lu ("parcouru" serait plus juste) ici, , ou , ...
    les hack xss "basiques" sont surtout de la forme :
    - <script>alert("on t'a eu !")</script>
    - <iframe src="http://site-du-hacker.com"></iframe>

    -> "Comment s'en protéger au mieux ?
    Une 1ère approche serait de supprimer toutes les balises <script> et <iframe> (et leur contenu) avec des regex, ou dom (?)
    -> "Sera-ce suffisant ?"
    -> "Quelle est la bonne méthode ?"
    Merci.
    Dernière modification par Invité ; 17/08/2011 à 14h45.

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    tu mets un htmlspecialchar() à l'affichage et ça suffit. souvent tu ne dois pas interpreter le code saisi à l'interieur du textarea... ... sinon:

    un peu de tidy pour nettoyer le code html saisi (parce que sinon ya des spécialiste dans le piégeage de la fonction strip_tag )
    un peu de dom pour interdire les balises scripts

    au fait pour moi utiliser mysql_real_escape_string() sans expliciter le "link" vers la ressource SQL m'a toujours semblé une mauvaise idée... c'est pas tout le temps faux... mais bon.. et puis pdo... et patati... et patata...

    je suis un grand fan des sanitizes... mais bon ça va t'enlever les caractères non ascii uniquement...

  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 : 37
    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
    Empêcher l'insertion de balises iframe et script me paraît suffisant.

    Tu peux le faire avec strip_tags en passant un tableau des tags autorisés.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    si tu veux garder la mise en forme html, fait simplement un strip_tags et garde les balises souhaité (<a> <p> <br> ...),

    ps : je te déconseille de faire un stripslashes, désactive plutôt les magic_quote, etl e htmlspecialschars doit se faire uniquement a l'affichage, ta base doit être intacte

  5. #5
    Invité
    Invité(e)
    Par défaut
    Me revoilà ...
    Le coupable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <p>Ceci est un autre article <strong>contenant une faille xss</strong><br /> 
    entre ici -><script type="text/javascript">alert('tu fais moins le malin !');</script><- et la !</p>
    -> htmlspecialchars() : ne fonctionne pas sur un textarea (puisque son rôle est justement de remplacer TOUTES les balises html, ... même les bonnes !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    &lt;p&gt;Ceci est un autre article &lt;strong&gt;contenant une faille xss&lt;/strong&gt;&lt;br /&gt; 
    entre ici -&gt;&lt;script type=&quot;text/javascript&quot;&gt;alert('tu fais moins le malin !');&lt;/script&gt;&lt;- et la !&lt;/p&gt;
    -> strip_tags() : nécessite une liste exhaustive des balises à conserver (je crains que ca ne soit limité, en terme d'"évolutivité")
    (dommage qu'il n'y ait pas une version "balises-a-supprimer")

    -> Il reste la piste : "supprimer les balises <script> et <iframe>" ...
    Je n'y connais rien en DOM ...
    J'ai bien vu ca DOMDocument::getElementsByTagName ou DOMDocument::getElementsByTagNameNS
    (mais comment les utiliser ?) -> je vais étudier le code de stealth35 ici ...

    Quelqu'un a la solution avec DOM ?
    Avant que je m'essaie aux regex (ce n'est pas gagné non plus !), et qu'on me tape sur les doigts ...

    Le but est d'obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <p>Ceci est un autre article <strong>contenant une faille xss</strong><br /> 
    entre ici -><- et la !</p>

  6. #6
    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 : 37
    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
    comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $html = <<< HTML
    <p>Ceci est du code <em>HTML</em></p>
    <span>Avec des morceaux de &lt;script&gt; dedans <script>alert('j\'aime les XSS');</script></span>
    HTML;
     
    $doc = new DOMDocument;
    $doc->loadHTML($html);
     
    $list = $doc->getElementsByTagName('script');
    foreach ($list as $node)
      $node->parentNode->removeChild($node);
     
    echo $doc->saveHTML();

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    y'a pas non plus énormément de balises (pour la liste c'est bien ce que tu fait avec la surpression de caractères accentués), je me contentais de ça (a rajouter/enlever si besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tags = '<a><strong><small><span><blockquote><cite><code><dd><dt><dl><div><p><em><pre><h1><h2><h3><h4><h5><h6><img><ul><ol><li><table><th><td><tr>';
    et encore pour du texte style commentaire j'en mettrait beaucoup moins

  8. #8
    Invité
    Invité(e)
    Par défaut
    @stealth35,
    ok pour ces balises, mais avec les nouvelles balises (html5, ...) et les mises à jour des éditeurs wysiwyg, on risque d'en rater à l'avenir, non ?

    [Edit] remarque stupide de ma part ... il suffit de mettre ca dans une fonction pour simplifier la mise à jour
    Dernière modification par Invité ; 17/08/2011 à 11h37.

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai un petit soucis : mon site "demo" est sur ... free.fr ! -> PHP Version 4.4.3-dev
    Il faudrait que j'utilise aussi DOM XML (PHP 4)
    ... ou que je puisse tester la version de php et switcher entre DOM et DOM XML (?)

    Ca se complique ...

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    J'ai un petit soucis : mon site "demo" est sur ... free.fr ! -> PHP Version 4.4.3-dev
    active PHP 5
    .htaccess : php 1

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bon. en regex, ca donne ca : "supprimer les balises <script> et <iframe>"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    function strip_faille_xss($text) 
    {
    	// suppression des balises <script>
    	$text = preg_replace('#<script(.*)/script>#Ui', '', $text);
    	// suppression des balises <iframe>
    	$text = preg_replace('#<iframe(.*)/iframe>#Ui', '', $text);
    	return $text;
    }
    ?>
    Dernière modification par Invité ; 17/08/2011 à 14h52.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    active PHP 5 -> .htaccess : php 1

    Donc, voici la version DOM :
    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
    <?php
    function no_faille_xss($text) 
    {
    	$doc = new DOMDocument();
    	$fragment = $doc->createDocumentFragment();
    	$fragment->appendXML($text);
    	$doc->appendChild($fragment);
    	// suppression des balises <script>
    	$list = $doc->getElementsByTagName('script');
    	foreach ($list as $node)
    		$node->parentNode->removeChild($node);
    	// suppression des balises <iframe>
    	$list = $doc->getElementsByTagName('iframe');
    	foreach ($list as $node)
    		$node->parentNode->removeChild($node);
     
    	return $doc->saveHTML();
    }
    ?>

  13. #13
    Nouveau membre du Club Avatar de antoinelavigne
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Points : 33
    Points
    33
    Par défaut
    Salut jreaux62,

    étant dans la même situation que toi, je me suis tourné vers tes REGEX.

    Le 1er (<script>) marche impec. Le 2ème (<iframe>) semble ne pas marcher chez moi ;

    Quand à la méthode DOM (jamais entendu parler de ce truc avant ), elle me fait bugger tous les messages de mon forum avec des fatals errors PHP.

    EDIT : finalement, en testant plusieurs formes d'iframe, toutes sont bloquées ! En fait, la difficulté sur cette balise vient du fait qu'elle peut prendre pleins de formes différentes, ce qui complique bien le truc

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'attends vos retours sur les fonctions : avec regex, ou avec dom.

    Après avoir testé les 2 :
    - avec regex : semble bien fonctionner, avec php4 ou php5
    - avec dom : semble bien fonctionner, SAUF quand il y a des entités html (&eacute;, &egrave;, ...) -> messages d'erreur

    Pour l'instant, ma préférence va aux regex ...

    ps : il me semble IMPORTANT de rappeler que ce ne sont pas des protection à 100% contre les failles xss !
    Ces fonctions ne suppriment QUE les balises <script> et <iframe> (et leur contenu).

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    donc ce te dérange pas d'avoir des balises <html> ou <body> dans ton texte, et briser la validation de ta page ? pourquoi ne pas retenir strips_tags c'est le plus simple a comprendre et a utiliser ...

  16. #16
    Invité
    Invité(e)
    Par défaut
    euuh, j'avais pas pensé à ca ! ...
    +1 pour strip_tags

    Et toi, stealth35, tu fais comment ?
    strip_tags ? avec ce que tu as indiqué plus haut ?

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    euuh, j'avais pas pensé à ca ! ...

    +1 pour strip_tags

    ps : j'ai du mal à penser comme un hackeur. Ce n'est pas dans ma mentalité ...

    allé je t'ai mis une autre faille pour la route y'a risque de CSRF

  18. #18
    Invité
    Invité(e)
    Par défaut
    Petite annonce - URGENT :
    Cherche petite ferme dans le Larzac, avec eau courante et éclairage à la bougie,
    pour y élever des chèvres, et fabriquer du bon fromage,
    loin de toute forme de technologie informatique ou de réseau wifi.
    Merci.

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    t’inquiètes pas après c'est des automatismes c'est comme faire du code HTML valide

  20. #20
    Invité
    Invité(e)
    Par défaut
    C'est vrai que jusqu'à présent, je n'avais jamais été confronté directement à ce problème.
    ... alors qu'on trouve des textarea dans tous les formulaires !

    Bon. Du coup ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    function strip_tags_textarea($text) 
    {
    	// balises qui seront conservees
    	$allowable_tags =  '<abbr><acronym><a><b><br><blockquote><cite><code><dl><dt><dd>';
    	$allowable_tags .= '<div><i><img><h1><h2><h3><h4><h5><h6><hr><p><span>';
    	$allowable_tags .= '<em><strong><small><pre><u><ul><ol><li>';
    	$allowable_tags .= '<table><caption><legend><thead><tfoot><tbody><tr><th><td><colgroup><col>';
    	return strip_tags($text, $allowable_tags);
    }
    ?>
    A voir s'il faut en ajouter ou en enlever...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Faille XSS
    Par smed79 dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2010, 19h24
  2. [IE 8] Quelles options modifier pour autoriser la faille XSS ?
    Par homeostasie dans le forum IE
    Réponses: 0
    Dernier message: 22/07/2009, 16h30
  3. Réponses: 2
    Dernier message: 08/05/2009, 16h53

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