2009-08-03 9 views
4

Programmation d'une application Web Python, je souhaite créer une zone de texte dans laquelle les utilisateurs peuvent saisir du texte dans un langage de balisage léger. Le texte sera importé dans un modèle html et visualisé sur la page. Aujourd'hui, j'utiliser cette commande pour créer la zone de texte, qui permet aux utilisateurs d'entrer tout (html) Texte:Langage de balisage léger pour Python

my_text = cgidata.getvalue('my_text', 'default_text') 
ftable.AddRow([Label(_('Enter your text')), 
       TextArea('my_text', my_text, rows=8, cols=60).Format()]) 

Comment puis-je changer cela pour que seulement quelques-uns (en toute sécurité, éventuellement léger) balisage est autorisé? Toutes les suggestions, y compris les désinfectants, sont les bienvenues, à condition qu'elles s'intègrent facilement avec Python.

Répondre

8

Utilisez le python markdown mise en œuvre

import markdown 
mode = "remove" # or "replace" or "escape" 
md = markdown.Markdown(safe_mode=mode) 
html = md.convert(text) 

Il est très flexible, vous pouvez utiliser plusieurs extensions, créez votre propre etc.

+0

Je l'ai essayé en utilisant iPython, en définissant le texte comme du code html, y compris un tag de script. J'ai eu une sortie étrange: le texte était toujours le même et html = '[HTML_REMOVED]' Que dois-je faire d'autre pour obtenir ceci pour enlever les étiquettes dangereuses? J'ai essayé tous les trois modes avec le même résultat. –

+0

En exécutant quelques tests, j'ai réalisé que je ne pouvais pas entrer de balises html, mais seulement une syntaxe markdown, et ce faisant, j'ai une sortie sécurisée. Merci, ça a marché! –

+0

à partir des documents Pour remplacer HTML, définissez safe_mode = "replace" (safe_mode = True fonctionne toujours pour la rétrocompatibilité avec les anciennes versions). Le code HTML sera remplacé par le texte défini dans markdown.HTML_REMOVED_TEXT qui est par défaut [HTML_REMOVED]. Pour remplacer le code HTML par quelque chose d'autre: markdown.HTML_REMOVED_TEXT = "--RAW LE HTML N'EST PAS AUTORISE--" – molicule

2

Vous pouvez utiliser restructured text. Je ne suis pas sûr qu'il ait une option de désinfection, mais il est bien supporté par Python, et il génère toutes sortes de formats.

+1

+1: règle RST et Docutils. –

1

Cette fonction simple désinfectante utilise une liste blanche et est à peu près le même que le solution de python-html-sanitizer-scrubber-filter, mais permet également de limiter l'utilisation des attributs (puisque vous ne voulez probablement pas que quelqu'un utilise, entre autres, l'attribut style):

from BeautifulSoup import BeautifulSoup 

def sanitize_html(value): 
    valid_tags = 'p i b strong a pre br'.split() 
    valid_attrs = 'href src'.split() 
    soup = BeautifulSoup(value) 
    for tag in soup.findAll(True): 
     if tag.name not in valid_tags: 
      tag.hidden = True 
     tag.attrs = [(attr, val) for attr, val in tag.attrs if attr in valid_attrs] 
    return soup.renderContents().decode('utf8').replace('javascript:', '') 
Questions connexes