2010-12-11 9 views

Antwort

4

Wollen Sie einen Weg, der schnell ist oder einen Weg, der richtig ist? Ein Regex-basierter Ansatz ist wahrscheinlich nicht korrekt und kann Sie bis zu XSS Angriffen öffnen.

Sie sollten einen HTML-Parser wie Beautiful Soup oder sogar htmllib verwenden.

Auch <a> kann javascript:href s enthalten und es gibt auch die verschiedenen on * Attribute, die Javascript sind. Sie möchten wahrscheinlich alle ausziehen. Im Allgemeinen ist eine Whitelist-Methode am besten: Bewahren Sie nur Attribute (und Attributwerte) auf, von denen Sie wissen, dass sie sicher sind.

+0

+1 für nicht Regex –

0

Ersetzen Sie die Elemente, die Sie behalten möchten mit einem Platzhalterwert, und setzen Sie dann alle verbleibenden <. *>, Ersetzen Sie schließlich die Platzhalter durch die entsprechenden HTML-Elemente.

+0

Ich schlage vor, BBcode für die Platzhalter zu verwenden, die Ihnen den netten Nebeneffekt der Unterstützung BBcode ohne zusätzliche Berechnung gibt. – Daniel

1

Während ich Laurence zustimme, gibt es Gelegenheiten, bei denen ein schneller und schmutziger 99% -Ansatz die Aufgabe erledigt, ohne andere Probleme zu verursachen.

Hier ist ein Beispiel, das einen regulären Ausdruck basierten Ansatz demonstriert -

import re 

CLEANBODY_RE = re.compile(r'<(/?)(.+?)>', re.M) 

def _repl(match): 
    tag = match.group(2).split(' ')[0] 
    if tag == 'p': 
     return '<%sp>' % match.group(1) 
    elif tag in ('a', 'br', 'ul', 'li', 'b', 'strong', 'em', 'i'): 
     return match.group(0) 
    return u'' 

def cleanbody(html): 
    return CLEANBODY_RE.sub(_repl, html) 
Verwandte Themen