2009-03-31 7 views
11

Ho sviluppato un'applicazione web che consente ai miei utenti di gestire alcuni aspetti di un sito web dinamicamente (sì, un qualche tipo di cms) in ambiente LAMP (debian, apache, php, mysql)Come posso consentire al mio utente di inserire codice HTML, senza rischi? (non solo rischi tecnici)

Bene, per esempio, creano una notizia nella loro area privata sul mio server, quindi questa viene pubblicata sul loro sito web tramite una richiesta CURL (o da ajax).

Le notizie vengono create con un editor WYSIWYG (fck al momento, probabilmente tinyMCE nel prossimo futuro).

Quindi, non posso disabilitare i tag html, ma come posso essere sicuro? Che tipo di tag DEVO eliminare (javascript?)? Che nel senso di essere sicuro per il server .. ma come essere 'legalmente' sicuro? Se un utente usa la mia applicazione per creare xss, posso avere qualche problema legale?

risposta

15

Se si utilizza php, una soluzione eccellente è utilizzare HTMLPurifier.Ha molte opzioni per filtrare le cose cattive e, come effetto collaterale, garantisce un output html ben formato. Lo uso per visualizzare lo spam che può essere un ambiente ostile.

+0

Ho deciso di prendere questa strada, oltre a qualche tipo di passaggi personali. Devo dare la totale libertà ai miei clienti di usare tag html ('cos dell'editor WYSIWYG), limitando solo alcune cose ... spero che tenerlo aggiornato con le ultime porte di sicurezza non sia molto problematico. – Strae

+1

Mi fido molto di più che mi fido dei miei sforzi .... – DGM

2

Anziché consentire l'HTML, è necessario disporre di un altro markup che può essere convertito in HTML. Cercando di striscia fuori canaglia HTML dall'input dell'utente è quasi impossibile, per esempio

<scr<script>ipt etc="..."> 

rimozione da questo lascerà

<script etc="..."> 
+0

U cantare una lista bianca piuttosto che una lista nera risolverebbe questo problema. – Gumbo

+0

vedere la risposta del tag img in http://stackoverflow.com/questions/701580/how-can-i-allow-my-user-to-insert-html-code-without-risks-not-only-technical-r/701609 # 701609 – cjk

+0

XSS è anche possibile attraverso altri linguaggi di marcatura, come BBcode, in modo che non risolva davvero nulla. Un approccio di whitelist funziona piuttosto bene. – troelskn

6

La migliore strategia generale è quella di whitelist tag e attributi specifici che si ritengono al sicuro e fuggire/rimuovere tutto il resto. Ad esempio, una whitelist ragionevole potrebbe essere <p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>. In alternativa, considera il markup human-friendly come Textile o Markdown che può essere facilmente convertito in HTML sicuro.

+0

Non è ancora possibile inserire script nei tag consentiti utilizzando una white-list? – jeroen

+0

Dipende da come li stai sfuggendo. Se stai descrivendo qualcosa come " ipt ...", vorrei prima notare che "" ed è anche scappato/rimosso. –

+0

Stavo pensando più agli attributi, ma suppongo che dipenda se la tua white-list ha dei tag che ne hanno bisogno, quindi dovresti accettarli. Se autorizzi gli attributi, dovresti liberarti dell'intera gamma onclick = "", ecc., Ma immagino che sia abbastanza ovvio :) – jeroen

11

Non importa quello che stai cercando di rimuovere, qualcuno troverà sempre un modo per aggirarlo. Come riferimento, dai un'occhiata a questo XSS Cheat Sheet.

A titolo di esempio, come stai mai andare a rimuovere questo attacco XSS valida:

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

l'opzione migliore è lasciare solo un sottoinsieme di tag accettabili e rimuovere qualsiasi altra cosa. Questa pratica è nota come White Listing ed è il metodo migliore per prevenire XSS (oltre a non consentire l'HTML.)

Utilizzare anche il foglio cheat nei test; fai fuoco il più possibile sul tuo sito web e prova a trovare alcuni modi per eseguire XSS.

+0

+1 per il cheat sheet –

0

Se è troppo difficile rimuovere i tag, è possibile rifiutare l'intero html-data finché l'utente non ne inserisce uno valido. Rifiuterei html se contiene i seguenti tag:

frameset, frame, iframe, script, object, embed, applet.

Anche i tag che si desidera disabilitare sono: head (e sub-tag), body, html perché si desidera fornire da soli e non si desidera che l'utente manipoli i metadati.

Ma in generale, consentendo all'utente di fornire il proprio codice html, impone sempre alcuni problemi di sicurezza.

0

Si potrebbe voler prendere in considerazione, piuttosto che consentire l'HTML a tutti, implementando alcuni standard per HTML come BBCode o Markdown.

2

Per un esempio C# di approccio alla lista bianca, che utilizza stackoverflow, è possibile consultare this page.

1

Kohana's security helper è piuttosto buono. Da quello che ricordo, è stato preso da un altro progetto.

Tuttavia Ho provato

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

Da LFSR Consulting's answer, ed è sfuggito in modo corretto.

-1

code that I should have just copy/pasted instead of screenshotting

E 'molto buona funzione in PHP è possibile utilizzarlo

$string = strip_tags($_POST['comment'], "<b>"); 
+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18479859) – codechurn

0

Io uso questa funzione strip_tags php perché voglio utente può inviare in modo sicuro e permetto solo alcuni tag che possono essere utilizzati in post in questo modo nessuno può incidere il vostro sito web attraverso l'iniezione script in modo penso strip_tags è migliore opzione

Clich here for code for this php function

Problemi correlati