¿Este desinfectante es vulnerable al XSS?

1

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?

    
pregunta Jand 04.09.2015 - 10:19
fuente

2 respuestas

8

El atributo class podría usarse para corregir la IU para hacer que los elementos no confiables y el texto parezcan textos autoritarios provenientes del propio sitio web.

Consulte el Manual de seguridad del navegador de Google para obtener más información.

En lugar de escribir el suyo, use un desinfectante HTML establecido como Google Caja . Estos son difíciles de escribir porque hay tantas formas de obtener los filtros XSS redondos .

También asegúrate de implementar un Política de seguridad del contenido : Google Caja se negará a ejecutar en el navegador.

    
respondido por el SilverlightFox 04.09.2015 - 11:12
fuente
4

BeatifulSoap no está diseñado como un Desinfectante para HTML, sino que está diseñado principalmente para extraer datos del HTML como se necesita en el raspado de pantalla. Eso es, no espere que se maneje correctamente con el HTML malformado que, sin embargo, es ejecutado por el navegador.

Aparte de eso, una gran parte de su pregunta ya está respondida en tu anterior . Y para citarme de una respuesta que escribí allí:

  

Si realmente desea permitir que HTML lo trate como cualquier otro tipo de marcado, es decir, analícelo en una forma interna y luego cree el HTML resultante a partir de esto.

Eso es exactamente lo que no haces. Es decir, considera que todos los HTML están sanos, donde no encuentra cosas malas en lugar de analizarlas en un formulario interno y crea un HTML definitivamente sano y bien formado que solo incluye las cosas que tiene explícitamente en la lista blanca. Por ejemplo, el usuario puede configurar el atributo de clase a cualquier cosa que sea peligrosa como escribí en mi respuesta a su pregunta anterior.

    
respondido por el Steffen Ullrich 04.09.2015 - 11:07
fuente

Lea otras preguntas en las etiquetas