Per avere un editor semplice e sicuro per i campi di testo di un'app django, ho questo snippet per disinfettare l'input HTML nel codice django:
from bs4 import BeautifulSoup
def sanitize_html(value):
tag_whitelist = ['img','b','strong','blockquote', 'a']
attr_whitelist = ['src', 'alt', 'width', 'height', 'href','class']
soup = BeautifulSoup(value)
for tag in soup.find_all():
if tag.name.lower() in tag_whitelist:
tag.attrs = { name: value for name, value in tag.attrs.items()
if name.lower() in attr_whitelist }
else:
tag.unwrap()
# scripts can be executed from comments in some cases
try:
comments = soup.find_all(text=lambda text:isinstance(text, Comment))
for comment in comments:
comment.extract()
except:
pass
return unicode(soup)
Ho anche inserito la lista nera inserendo javascript
nei campi del modello usando questo metodo:
BADLIST = ['javascript']
def no_js (text):
if any(e in text for e in BADLIST):
raise ValidationError("Your text contains bad words!")
else:
return True
D'altra parte, nel modello devo usare {{text| safe}}
per consentire la visualizzazione di tag HTML sani.
Quindi mi chiedo con questi limiti, se l'input è ancora vulnerabile allo scripting cross-site (XSS)? E se sì, come risolverlo?