2011-11-04 9 views
5

funzionalità di prevenzione Grails XSS è piuttosto comodo, così ho abilitato utilizzando:Preserve nuove linee quando si utilizza il codec HTML in Grails viste

grails.views.default.codec = "html" 

Anche se, questo crea un problema con html textareas. Se completiamo un textarea e usiamo Invio per interrompere le linee, le nuove linee vengono salvate nel DB, ma vengono ignorate nella vista. Potrei usare <%=%> e replaceAll('\n',"<br>") per correggere le interruzioni di riga, ma il codice HTML compilato nello textarea non sarebbe stato scappato e non ci sarebbe stata alcuna prevenzione XSS!

Come risolverebbe questo problema?

risposta

10

Prima di pronunciare il tuo textarea nel GSP, si potrebbe

  • codificare la stringa come HTML
  • convertire i caratteri di nuova riga alla <br/>.

Ciò può essere ottenuto salvando il seguente tag lib a graal-app/taglib:

class LinesTagLib { 
    def lines = { attrs, body -> 
    out << attrs['string'].encodeAsHTML().replace('\n', '<br/>\n') 
    } 
} 

Come abbiamo già applicato encodeAsHTML() nel tag, si dovrà disabilitare codec HTML quando si utilizza il tag (usando <%=expression%> invece di ${expression}):

<g:lines string="<%=savedTextarea%>" /> 

un'alternativa sarebbe quella di scrivere il proprio codec per questo:

class HTMLLinesCodec{ 
    static encode = { str -> 
    str.encodeAsHTML().replace('\n', '<br/>\n') 
    } 
} 

È quindi possibile utilizzare questo codec per i file GSP in cui si desidera questo comportamento con l'aggiunta di direttiva:

<%@ defaultCodec="HTMLLines" %> 
+1

Hey Antony, grazie per la risposta. Ho trovato una soluzione intermedia. Cosa ne pensi di mantenere l'enconding come "html" ma di elaborare i miei textareas con: <% = book? .description? .encodeAsHTML(). ReplaceAll ('\ n', '
')%>. Vedi qualche carenza in questa soluzione? – Pomario

+1

La tua soluzione sembra OK. Non mi piace avere affermazioni così complicate ovunque nei miei GSP, ecco perché utilizzerei un TagLib. Se in seguito decidi che desideri racchiudere le righe nella stringa '

', devi solo cambiare TagLib. Ma hai ragione, se lo usi solo in un posto, quindi usando '<% = book? .description? .encodeAsHTML(). ReplaceAll ('\ n', '
')%>' potrebbe essere la soluzione più veloce . – Antoine

+0

Ho dovuto aggiungere staticEncodeAs = "raw" statico in LinesTagLib e usarlo come (Grails 2.3.6) – CoPLaS

Problemi correlati