Question

En programmant 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'utilise cette commande pour créer la zone de texte, qui permet aux utilisateurs de saisir du texte (HTML):

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 seul un balisage (sûr, éventuellement léger) soit autorisé? Toutes les suggestions, y compris les désinfectants, sont les bienvenues, à condition qu’elles s’intègrent facilement à Python.

Était-ce utile?

La solution

Utilisez le mise en oeuvre de python

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

C’est très flexible, vous pouvez utiliser diverses extensions, créer votre propre etc.

Autres conseils

Vous pouvez utiliser le texte restructuré . Je ne sais pas s'il existe une option de désinfection, mais elle est bien supportée par Python et génère toutes sortes de formats.

Cette simple fonction de désinfection utilise une liste blanche et est à peu près identique à la solution de python-html -sanitizer-scrubber-filter , mais permet également de limiter l'utilisation d'attributs (car 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:', '')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top