2011-11-08 12 views
9

In questo momento stiamo utilizzando la gemma sanitize: https://github.com/rgrove/sanitizeRails Gem disinfettare - Come whitelist &

Il problema è che se si immette "hello & world" disinfettare è il risparmio che nel DB come:

hello & world 

Come si può autorizzare la lista &. Vogliamo disinfettare per rimuovere tutti i possibili tag html e JS/script dannosi. ma stiamo bene permettendo la e commerciale.

Idee? Grazie

+0

Può essere Sanitize.cl ean (html, Sanitize :: Config :: RELAXED) # => '&' –

+0

Grazie ma RELAXED consente praticamente tutto. Mi piacerebbe fare la lista bianca e non riesco a scoprire come – AnApprentice

+0

@ bilash.saha La configurazione rilassata sarà ancora html-escape entità, ciò che hai postato uscirà ancora "Hello & world" – Unixmonkey

risposta

2

Sanitize trasformerà sempre ciò che viene emesso in entità html per html/xhtml valido.

Il modo migliore possibile determinare è filtrata all'uscita

Sanitize.clean("hello & world").gsub('&','&') #=> "Hello & world" 
+0

Questo risolverebbe il carattere &, ma sarebbe non scala tutti i vari caratteri che il motore html utilizzato convertirà in entità. Cercando di tenere traccia di tutto ciò sarebbe anche un mal di testa. La risposta di @ Agustin sotto è una soluzione migliore IMO –

+0

@ShyamHabarakada Il problema che ho con 'built-in 'sanitize()' e 'strip_tags', è che non correggono il markup malformato, quindi un carattere' <'non corrispondente può distruggi il layout della pagina. 'strip_tags ('Strip " Strip Unixmonkey

+0

È vero, riguardo al markup malformato. Sanitizziamo principalmente come un modo per impedire che l'HTML entri in parametri che non dovrebbero avere HTML. Strippare i tag tramite gli strip_tags integrati funziona bene per noi. Sembra che sia lo scenario anche in questa domanda. Sono d'accordo, se si desidera la completa disinfezione, è necessaria una soluzione migliore con un motore DOM adeguato. Ma per la sanificazione param, IMO, sembra eccessivo. –

1

risposta di UnixMonkey è quello che abbiamo finito per fare.

def remove_markup(html_str) 
    marked_up = Sanitize.clean html_str 

    ESCAPE_SEQUENCES.each do |esc_seq, ascii_seq| 
     marked_up = marked_up.gsub('&' + esc_seq + ';', ascii_seq.chr) 
    end 
    marked_up 
    end 

Dove ESCAPE_SEQUENCES era una serie di personaggi che non volevamo sfuggito.

+0

Vedi http://www.escapecodes.info/ per i codici carattere di escape – tee

0

Come di Rails 4.2, #strip_tags non unencode HTML caratteri speciali

strip_tags("fun & co") 
    => "fun &amp; co" 

In caso contrario si otterrebbe il seguente:

strip_tags("&lt;script&gt;") 
    => "<script>" 

Se si desidera solo la e commerciale suggerirei filtrando il output come @Unixmonkey suggerito e tenerlo a & solo

strip_tags("<bold>Hello & World</bold>").gsub(/&amp;/, "&") 
    => "Hello & World"