2009-09-29 13 views
5

Mi stavo chiedendo, e non ero ancora in grado di trovare alcuna risposta online, come ottenere quanto segue.Rails - Escaping HTML usando h() E escludendo tag specifici

Diciamo che ho una stringa che contiene il seguente:

my_string = "Ciao , io sono una stringa." (nella finestra di anteprima vedo che questa è effettivamente la formattazione in BOLD e ITALIC invece di mostrare i tag "strong" e "i")

Ora, vorrei renderlo sicuro, usando html_escape() (o h()) metodo/funzione. Quindi vorrei impedire agli utenti di inserire javascript e/o fogli di stile, tuttavia, desidero ancora che la parola "Ciao" sia visualizzata in grassetto e la parola "stringa" mostrata in corsivo.

Per quanto posso vedere, il metodo h() non accetta argomenti aggiuntivi, oltre alla parte di testo stessa.

Esiste un modo per evitare solo determinati tag HTML, anziché tutti? Ti piacciono i tag delle quotazioni Bianco o Nero?

Esempio di ciò che questo potrebbe essere simile, di quello che sto cercando di dire sarebbe:

h (my_string,: ad eccezione => [: forti,: i]) # => Quindi, in pratica, di fuga tutto, ma lascia i tag "strong" e "i" da soli, non sfuggirli.

Esiste un metodo o un modo per ottenerlo?

Grazie in anticipo!

risposta

3

L'esclusione di tag specifici è in realtà un problema piuttosto difficile. Soprattutto il tag script può essere inserito in very many different ways - rilevarli tutti è molto complicato.

Se possibile, non implementarlo da soli.

2

Hai considerato l'utilizzo di RedCloth o BlueCloth invece di consentire effettivamente l'HTML? Questi metodi forniscono un bel po 'di opzioni di formattazione e gestiscono l'analisi per te.

Modifica 1: Ho trovato this message durante la ricerca di come rimuovere HTML utilizzando RedCloth, potrebbe essere di qualche utilità. Inoltre, this page mostra come la versione 2.0.5 consente di rimuovere HTML. Impossibile trovare nuove informazioni, ma un valore forum post ha rilevato una vulnerabilità. Si spera che sia stato risolto dal 2006, ma non riesco a trovare un manuale o documentazione RedCloth ...

+0

RedCloth è ottimo, ma non _non_ rimuove i tag html; Posso inserire e non sarà sfuggito. Non sono sicuro di come BlueCloth toglie l'HTML; Non l'ho mai usato prima. – zgchurch

1

Vorrei rimuovere Sanitize per rimuovere i tag HTML. Funziona davvero bene. Rimuove tutto per impostazione predefinita e puoi specificare una lista bianca per i tag che vuoi consentire.

0

Prevenire gli attacchi XSS è un business serio, seguire hrnt's e considerare che c'è probabilmente un ordine di grandezza più exploit di quello possibile a causa di oscure stranezze del browser.Sebbene html_escape bloccherà abbastanza le cose, penso che sia un errore usare qualcosa di homegrown per questo tipo di cose. Hai semplicemente bisogno di più occhi e revisioni tra pari per qualsiasi tipo di garanzia di robustezza.

Al momento sono in fase di valutazione sanitize rispetto a XssTerminate. Preferisco l'approccio xss_terminate per la sua robustezza-scrub a livello di modello sarà abbastanza affidabile in una normale app Rails dove tutti gli input dell'utente passano attraverso ActiveRecord, ma Nokogiri e in particolare Loofah sembrano essere un po 'più peformanti, più attivamente mantenuti, e sicuramente più flessibile e rubino.

Aggiornamento Ho appena implementato un fork di ActsAsTextiled chiamato ActsAsSanitiled che utilizza Santize (che è stato recentemente aggiornato per utilizzare nokogiri tra l'altro) per garantire la sicurezza e ben formati dell'uscita RedCloth, il tutto senza bisogno di alcun aiutanti nei tuoi modelli.