Para tener un editor simple y seguro para los campos de texto de una aplicación de django, tengo este fragmento para sanear el HTML de entrada en el código de 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)
También he incluido en la lista negra el ingreso de javascript
en los campos modelo usando este método:
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
Por otro lado, en la plantilla necesito usar {{text| safe}}
para permitir que se muestren etiquetas HTML saludables.
Entonces, con estas restricciones, me pregunto si la entrada aún es vulnerable a los scripts entre sitios (XSS). Y si es así, ¿cómo solucionarlo?