Che cosa fai quando un cliente richiede il Rich Text Editing sul loro sito web?

15

Come tutti sappiamo ormai, gli attacchi XSS sono pericolosi e veramente facile da estrarre . Vari framework semplificano la codifica di HTML, come ASP.NET MVC:

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

Ma cosa succede quando il cliente richiede di essere 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 sono pubblicate su una pagina Web.

Il sito web è pubblico, ma solo i membri di tale organizzazione avranno accesso alla pubblicazione di informazioni su una pagina web.

Come gestisco questi requisiti in modo sicuro? Attualmente non viene effettuato alcun controllo su ciò che il client invia (poiché solo gli utenti "fidati" possono pubblicare), ma non ne sono particolarmente soddisfatto e vorrei chiuderlo ulteriormente nel caso in cui un account venga violato.

L'unico metodo concettuale di cui sono a conoscenza che soddisfi questi requisiti è quello di inserire tag HTML nella whitelist e lasciarli passare . C'è un altro modo? In caso contrario, qual è un modo sicuro per consentire all'utente di memorizzare l'input nel Database in qualsiasi forma, ma solo visualizzarlo correttamente codificato e privo di tag non validi?

Domanda correlata

Preventing Cross Site Scripting (XSS)

    
posta George Stocker 18.06.2009 - 21:37
fonte

5 risposte

8

Il modo più semplice (per te come sviluppatore) è probabilmente quello di implementare una delle molte varianti di Markdown , ad esempio < a href="http://aspnetresources.com/blog/markdown%5Fannounced.aspx"> Markdown.NET o, meglio ancora (imho), a WMD-editor di .

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

    
risposta data 18.06.2009 - 21:52
fonte
7

La whitelisting è davvero il modo migliore per prevenire gli attacchi XSS quando si consente agli utenti di inserire HTML, direttamente o utilizzando un editor di testo avanzato.

Informazioni sulle altre tue domande:

Is there a WYSIWYG editor that includes the ability to whitelist on the fly?

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

TinyMCE filtra i tag se vuoi, ma dal momento che ciò avviene nel browser non puoi fidarti di esso. Vedi extended_valid_elements . Anche TinyMCE (Moxie) suggerisce la whitelist, vedi qui .

Should I even worry about this since it will only be for 'private posting'

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

is the best way to let them store it in the Database in any form, but only display it properly encoded and stripped of bad tags?

È così che preferisco. Non mi piace modificare l'input dell'utente prima di inserirlo nel database per vari motivi.

    
risposta data 05.07.2009 - 03:26
fonte
-1

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

Potresti usare il codice qui sotto se preferisci prima che venga inserito nel database, ma non sei sicuro di quale effetto potrebbe avere su di te. 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;
    }
    
risposta data 18.06.2009 - 21:52
fonte
-1

Un'opzione potrebbe essere il HTML Edit Control per .NET (che ho scritto).

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

Se è per uso interno (cioè 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 Doc a Convertitore HTML ; quindi ho i blocchi di base che è possibile utilizzare in ASP.NET per convertire un documento in HTML, visualizzare l'HTML nell'editor, ecc.

    
risposta data 09.09.2010 - 00:33
fonte
-2

Il mio IMHO continua a fidarsi degli utenti fino a quando non diventerà pubblico.

Bene, non esiste un modo affidabile per raggiungere i tuoi bisogni. Ad esempio, qualsiasi editor WYSIWYG non riesce a proteggere il modulo inserendo immagini con URL (traccia di utilizzo indiretto, contenuto illegale) o testo (testo non valido, testo errato, testo mancante).

Il mio punto di vista è che se puoi fidarti dei tuoi utenti, semplicemente permetti tutto, basta avvisare gli utenti se ci sono KNOW markup pericolosi (per tenerli lontani dagli errori).

Se non ti fidi, utilizza una sorta di markup speciale (ad esempio 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 è molto alta (ad esempio ogni modifica dovrebbe essere esaminata da due codificatori indipendenti, abbiamo una suite di test completa e così via).

    
risposta data 06.07.2009 - 00:11
fonte

Leggi altre domande sui tag