2009-11-10 3 views
2

J'ai un html (dans ce cas créé via TinyMCE) que j'aimerais ajouter à une page. Cependant, pour des raisons de sécurité, je ne veux pas simplement imprimer tout ce que l'utilisateur a saisi.Django templatetag pour rendre un sous-ensemble de html

Est-ce que quelqu'un sait d'un templatetag (un filtre, de préférence) qui permettra seulement de rendre un sous-ensemble sûr de html? Je réalise que markdown et d'autres le font. Cependant, ils ajoutent également une syntaxe de balisage supplémentaire qui pourrait être source de confusion pour mes utilisateurs, car ils utilisent un éditeur de texte enrichi qui ne connaît pas le démarquage.

Répondre

6

Il y a removetags, mais il est une approche de listes noires qui ne parvient pas à supprimer les balises quand ils ne regardent pas exactement comme les balises bien formés Django s'attend à ce que, et bien sûr, puisqu'il ne tente pas de supprimer les attributs, il est totalement vulnérable aux 1 000 autres moyens d'injection de script qui n'impliquent pas la balise <script>. C'est un piège, offrant l'illusion de la sécurité tout en n'offrant aucune réelle sécurité.

Les approches de désinfection HTML basées sur le piratage d'expressions régulières sont presque inévitablement un échec total. Utiliser un analyseur HTML réel pour obtenir un modèle objet pour le contenu soumis, puis filtrer et re-sérialiser dans un format connu, est généralement l'approche la plus fiable. Si votre éditeur de texte enrichi sort du XHTML c'est facile, utilisez simplement minidom ou etree pour analyser le document, puis passez dessus en supprimant tous les éléments et attributs, sauf ceux qui sont connus, et enfin en convertissant en XML sécurisé. Si, d'un autre côté, il crache HTML, ou permet à l'utilisateur d'entrer du HTML brut, vous devrez peut-être utiliser quelque chose comme BeautifulSoup. Voir this question pour une discussion. Filtrage HTML est un sujet vaste et compliqué, ce qui explique pourquoi beaucoup de gens préfèrent les langages de balisage texte-avec-restrictif.

-1

Vous pouvez utiliser removetags pour spécifier la liste des balises à supprimer:

{{ data|removetags:"script" }} 
+2

-1 C'est pire que rien, car cela donne l'illusion d'une sécurité sans réel bénéfice. Il y a un million de façons de contourner ce type d'approche de liste noire. –

0

Utilisez HTML Purifier, html5lib ou une autre bibliothèque conçue pour la désinfection HTML.

Questions connexes