Questo disinfettante è vulnerabile a XSS?

1

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?

    
posta Jand 04.09.2015 - 10:19
fonte

2 risposte

8

L'attributo class potrebbe essere utilizzato per correggere l'interfaccia utente per rendere elementi non attendibili e il testo sembra essere un testo autorevole proveniente dal sito stesso.

Per ulteriori informazioni, consulta Manuale di sicurezza del browser di Google .

Invece di scrivere il tuo, usa un igienizzatore di HTML stabilito come Google Caja . Questi sono difficili da scrivere perché ci sono tanti modi per aggirare i filtri XSS .

Assicurati inoltre di implementare una norme sulla sicurezza dei contenuti - quindi qualsiasi cosa che si nasconde round Google Caja si rifiuterà di eseguire nel browser.

    
risposta data 04.09.2015 - 11:12
fonte
4

BeatifulSoap non è progettato come disinfettante per HTML ma è progettato principalmente per l'estrazione di dati dall'HTML, come richiesto nello screen scraping. Questo non è previsto che funzioni correttamente con HTML malformato che viene comunque eseguito dal browser.

A parte questo, gran parte della tua domanda ha già una risposta in il tuo precedente . E per citarmi da una risposta che ho scritto lì:

If you really want to allow HTML treat it like any other kind of markup, i.e. parse it into an internal form and then create the resulting HTML out of this.

Questo è esattamente ciò che non fai. Quello che consideri tutto l'HTML sano dove non trovi cose cattive invece di analizzarlo in una forma interna e creare un codice HTML sano e ben definito da esso che include solo cose che hai elencato esplicitamente in bianco. Ad esempio, l'utente può impostare l'attributo di classe su qualsiasi cosa che sia pericolosa come ho scritto nella mia risposta al tuo domanda precedente.

    
risposta data 04.09.2015 - 11:07
fonte

Leggi altre domande sui tag