Domanda

Ho bisogno di attuare un semplice ed efficace filtro XSS in C ++ per CppCMS . Non posso usare i filtri di alta qualità esistenti scritto in PHP, perché, perché è framework ad alte prestazioni che utilizza C ++.

L'idea di base è di fornire un filtro che hanno una lista, mentre di tag HTML e un bianco elenco delle opzioni per questi tag. Per esempio. tipico input HTML può essere costituito da <b>, <i>, tag e tag <a> con href. Ma semplice implementazione non è abbastanza buono, perché, anche consentiti collegamenti semplici possono includere XSS:

<a href="javascript:alert('XSS')">Click On Me</a>

Ci sono molti altri esempi si possono trovare . Così ho pensato anche di una possibilità di creare una lista bianca di prefissi per tag come href / src - quindi ho sempre bisogno di controllare se inizia con (https?|ftp)://

Domande:

  • Sono queste assunzioni sono abbastanza buono per la maggior parte di scopi? Il che significa che se non lo faccio dare una possibilità per i tag style e verificare src / href utilizzando lista bianca dei prefissi ne risolva problemi XSS? ci sono problemi che non possono essere risolti in questo modo?
  • C'è un buon riferimento per grammatica formale di HTML / XHTML, al fine di scrivere semplici parser che avrebbe pulitura tutto errata del tag proibiti come <script>
È stato utile?

Soluzione

Si può dare un'occhiata al progetto Anti Samy, cercando di realizzare la stessa cosa. E 'Java e .NET però.

Modifica 1, un po 'extra:

È possibile potenzialmente venire con un elenco molto severo bianco. Esso dovrebbe essere strutturato bene e dovrebbe essere abbastanza stretto e non molto flessibile. Quando si combinano la flessibilità, così molti tag, attributi e diversi browser in genere si finisce con una vulnerabilità XSS.

Non so che cosa è le vostre esigenze, ma mi piacerebbe andare con una rigorosa e semplice supporto per i tag (solo B Li H1, ecc) e poi stretto supporto attributo basato sul tag (ad esempio src è valida solo sotto href tag), allora avete bisogno di fare whitelisting nei valori degli attributi come avete dichiarato http | https | ftp o style = "color | background-color" etc

.

Considerate questo:

<x style="express/**/ion:(alert(/bah!/))">

Inoltre è necessario pensare a qualche whitelisting personaggio o qualche UTF-8 normalizzazione, perché differenti codifiche possono causare problemi imbarazzanti. Come nuove linee attributi, sequenze UTF-8 non validi.

Altri suggerimenti

Tutti i dettagli di parsing del codice HTML sono specificati in HTML 5 . Tuttavia l'attuazione di esso è un bel po 'di lavoro, e non importa se si analizza HTML esattamente con tutti i casi d'angolo. Nel peggiore dei casi vi ritroverete con diversi DOM, ma è necessario disinfettare DOM in ogni caso.

Come lei ha ricordato, ci sono varie implementazioni PHP di questo, ma non so di qualsiasi in C ++, dal momento che non è un linguaggio tipicamente applicata per lo sviluppo web. Nel complesso, sta andando a dipendere da quanto complessa di un'implementazione che si desidera trovare.

Una whitelist molto restrittiva è probabilmente il modo "semplice", ma se si vuole essere veramente completo che apparirebbe a fare una conversione di una delle versioni stabilite per C ++, invece di cercare di scrivere il proprio da zero. Ci sono così tanti trucchi di cui preoccuparsi, che penso che sarebbe meglio in piedi sulle spalle di altri che sono già passati attraverso tutto questo.

Non so nulla su come utilizzare C ++ per lo sviluppo web, ma la conversione di PHP ad esso non sembra che sarebbe stato un compito particolarmente difficile, PHP in realtà non ha nessun capacità magiche che C ++ non sarà in grado da duplicare. Sono sicuro che ci saranno alcuni piccoli intoppi, ma nel complesso se si vuole andare il percorso più complesso che sarebbe sicuramente ancora essere più veloce per fare una conversione di un disegno completo da zero.

HTML Purifier sembra una forte implementazione di PHP che è ancora mantenuto attivamente, c'è un documento di confronto dove l'autore discutere alcune differenze tra il suo approccio e gli altri, probabilmente vale la pena leggere.

Qualunque cosa si arriva con, sicuramente prova con tutti gli esempi si collega, e verificare che venga superato tutte le persone. Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top