Cosa fai quando un cliente richiede Rich Text Editing sul suo sito Web?


18

Come ormai tutti sappiamo, gli attacchi XSS sono pericolosi e davvero facili da eseguire . Vari framework semplificano la codifica dell'HTML, come ASP.NET MVC:

<%= Html.Encode("string"); %>

Ma cosa succede quando il tuo client richiede che siano in grado di caricare i propri contenuti direttamente da un documento di Microsoft Word?

Ecco lo scenario: le persone possono copiare e incollare il contenuto da Microsoft Word in un editor WYSIWYG (in questo caso tinyMCE ), quindi tali informazioni vengono pubblicate in una pagina Web.

Il sito Web è pubblico, ma solo i membri di tale organizzazione avranno accesso a pubblicare informazioni su una pagina Web.

Come gestisco questi requisiti in modo sicuro? Al momento non viene effettuato alcun controllo su ciò che il cliente pubblica (dal momento che solo gli utenti "fidati" possono pubblicare), ma non ne sono particolarmente soddisfatto e vorrei bloccarlo ulteriormente in caso di violazione di un account.

L'unico metodo concettuale di cui sono a conoscenza che soddisfa questi requisiti è di autorizzare i tag HTML e lasciarli passare . C'è un altro modo? In caso contrario, qual è un modo sicuro per consentire all'utente di archiviare l'input nel database in qualsiasi forma, ma solo visualizzarlo correttamente codificato e privo di tag errati?

Domanda correlata

Prevenzione degli script tra siti (XSS)


Nizza Question- ecco un simile uno però- stackoverflow.com/questions/445177/...
RichardOD

Concordato. È simile, ma è una domanda confusa (la domanda è difficile da trovare) e non si chiede specificamente se esiste un altro modo. Se c'è un altro modo per eseguire il rendering HTML senza dover aggiungere la whitelist, ci sto lavorando. Se esiste un ASP.NET MVC View Engine che si occupa di questo, è bene saperlo anche.
George Stocker,

In una nota non relativa alla sicurezza, il filtro dei tag sarà probabilmente utile dal punto di vista dell'interfaccia utente. È molto facile digitare accidentalmente una parentesi angolare e dimenticare di scappare. Dal momento che stiamo parlando di utenti che stanno copiando da Word, è una buona idea catturare quelli che sembrano tag errati e codificarli in modo appropriato (cioè & amp; lt;) in modo che le cose funzionino.

Per quanto riguarda il punto 4: scommetti che è ancora un problema! La maggior parte degli hack è un lavoro interno, dopo tutto. Per un editore specifico, ho avuto fortuna usando FreeTextBox ma non posso parlare di quanto corrisponda alle tue esigenze, in particolare MVC.
Joel Coehoorn,

1
@gnat Grazie; modificato. Sembra che la mia domanda abbia attirato l'attenzione di una specie di cabala; tre downgrade in rapida successione e la richiesta di protezione e modifica.
George Stocker,

Risposte:


8

Il modo più semplice (per te come sviluppatore) è probabilmente quello di implementare una delle tante varianti di Markdown , ad esempio Markdown.NET o, ancora meglio (imho), un editor di wmd .

Quindi, i tuoi utenti sarebbero in grado di incollare HTML semplice, ma nulla di pericoloso, e sarebbero in grado di visualizzare in anteprima i loro dati inseriti e raddrizzare eventuali scrupoli anche prima di pubblicare ...


Credo che StackOverflow utilizzi un editor personalizzato senza la necessità della sintassi di WMD
Jon,


Cosa intendi con sintassi di WMD? Per quanto ne so, funziona tutta la sintassi di WMD. E non ho ancora trovato nulla che non funzioni ...

2
Il problema con l'utilizzo di Markdown è che markdown consente HTML arbitrario; quindi di per sé non è una soluzione.
George Stocker,

7

La whitelisting è davvero il modo migliore per prevenire gli attacchi XSS quando consente agli utenti di inserire HTML, direttamente o usando un editor Rich Text.

Informazioni sulle altre tue domande:

Esiste un editor WYSIWYG che include la possibilità di autorizzare al volo?

Non penso che potrebbe funzionare. Per questo è necessario il codice lato server e l'RTE viene eseguito sul client.

TinyMCE filtra i tag se lo desideri, ma poiché ciò avviene nel browser, non puoi fidarti. Vedi extended_valid_elements . TinyMCE (Moxie) suggerisce anche la whitelisting, vedi qui .

Dovrei anche preoccuparmi di questo dal momento che sarà solo per "invio privato"

Devi sempre filtrare HTML a meno che non ci siano ragioni specifiche per non (molto raro). Alcuni motivi: a) funzionalità che è per gli utenti interni oggi forse per il pubblico domani b) l'accesso non autorizzato avrà un impatto minore

è il modo migliore per lasciarlo archiviare nel database in qualsiasi forma, ma visualizzarlo solo correttamente codificato e privo di tag errati?

Questo è il modo in cui lo preferisco. Non mi piace modificare l'input dell'utente prima di inserirlo nel database per vari motivi.


-1

Sto facendo la stessa cosa. Sto usando TinyMCE e consento di incollare da documenti Word. Solo determinate persone che gestiscono il sito possono farlo tramite un'area di amministrazione. Questo è garantito dall'iscrizione ASP.Net. Sto semplicemente facendo HTML.Encode quando viene inviato al sito pubblico.

È possibile utilizzare il codice riportato di seguito, se lo si desidera, prima che venga inserito nel database, ma non si è sicuri di cosa influirebbe. Potrebbe essere necessario andare con la tua lista bianca.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

Se memorizzano testo come <script> alert ("hey") </script> e fai Html.Encode (<script> alert ("hey") </script>) lo stamperà semplicemente per non eseguire la pagina avviso
Jon,

Non sto usando una lista bianca, la sto solo conservando così com'è. La funzione sopra potrebbe essere d'aiuto, ma non so quale effetto a catena avrà. Vorrei sapere cosa decidi tu. Perché il mio post è contrassegnato come negativo?
Jon,

1
Immagino che sia perché il modo in cui il tuo software lo sta eseguendo è un'implementazione molto ingenua; ci sono tutti i tipi di trucchi che aggireranno la tua implementazione.
George Stocker,

4
Una whitelist è una buona idea, ma il tuo metodo certamente non lo è. Regex non è un modo affidabile per rilevare i tag nel testo, in quanto l'HTML può essere piuttosto offuscato. Molto meglio usare una libreria come HTML Agility Pack.
Noldorin,

-1

Un'opzione potrebbe essere il controllo di modifica HTML per .NET (che ho scritto).

È un editor HTML WYSIWYM per .NET, che supporta solo un sottoinsieme degli elementi HTML , esclusi gli <script>elementi: in questo modo funge da whitelist.

Se è per uso interno (ovvero un sito Intranet), il controllo può essere incorporato in una pagina Web .

Non ho integrato il supporto per incollare da Word, ma ho un componente che è un passo in quella direzione: un convertitore da Doc a HTML ; quindi ho i mattoni che potresti usare in ASP.NET per convertire un documento in HTML, visualizzare l'HTML nell'editor, ecc.


-2

Il mio IMHO continua a fidarsi dei tuoi utenti fino a quando non diventerai pubblico.

Bene, non esiste un modo affidabile per soddisfare le tue esigenze. Ad esempio, qualsiasi editor WYSIWYG non riesce a proteggere il modulo inserendo immagini con URL (traccia di utilizzo indiretto, contenuto illegale) o testo (testo illegale, testo errato, testo errato).

Il mio punto di vista è che se puoi fidarti dei tuoi utenti, consenti semplicemente tutto, avvisa gli utenti se ci sono CONOSCENZE markup pericolose (per evitare che si verifichino errori).

Se non ti fidi, usa una sorta di markup speciale (es. Markdown).

Nel mio progetto utilizziamo tipi speciali per contenuti potenzialmente pericolosi e metodi speciali per il rendering e l'accettazione di tali contenuti. Questo codice ha un punteggio elevato nel nostro modello di thread e l'attenzione ad esso è molto alta (ad esempio ogni modifica dovrebbe essere rivista da due programmatori indipendenti, abbiamo una suite di test completa e così via).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.