2011-11-04 22 views
5

Grails XSS funkcjonalność profilaktyka jest bardzo poręczny, więc włączony go za pomocą:Zachowaj nowych linii przy użyciu kodeka HTML w Grails postrzega

grails.views.default.codec = "html" 

Choć ta stwarza problem z HTML textareas. Jeśli wypełnimy textarea i użyjemy Enter, aby przerwać linie, nowe linie zostaną zapisane w DB, ale są one ignorowane w widoku. Mogłabym użyć <%=%> i replaceAll('\n',"<br>"), aby naprawić przerwy w linii, ale kod HTML wypełniony w textarea nie zostałby zmieniony i nie byłoby żadnej prewencji XSS!

Jak można rozwiązać ten problem?

Odpowiedz

10

Przed renderowania swoją textarea z powrotem w GSP, można

  • zakodować ciąg jako HTML
  • przekonwertować znaki nowej linii do <br/>.

ten można osiągnąć zapisując następujący tag lib grails-app/TagLib:

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

Jak już stosowane encodeAsHTML() w tagu, trzeba będzie wyłączyć kodek HTML przy użyciu znacznik (stosując <%=expression%> zamiast ${expression})

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

alternatywą byłoby napisać własny kodek za to:

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

Można wtedy użyć tego kodeka plików GSP gdzie chcesz to zachowanie dodając dyrektywy:

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

Antony Hej, dzięki za odpowiedź. Wymyśliłem rozwiązanie pośredniczące. Co mówisz o zachowaniu encondingu jako "html", ale przetwarzaniu moich tekstów za pomocą: <% = book? .description? .encodeAsHTML(). ReplaceAll ('\ n', '
')%>. Czy widzisz jakieś niedociągnięcia w tym rozwiązaniu? – Pomario

+1

Twoje rozwiązanie wygląda OK. Nie lubię mieć tak skomplikowanych stwierdzeń wszędzie w moich GSP, dlatego używałbym TagLib. Jeśli później zdecydujesz, że chcesz zamknąć linie w '

string

', musisz zmienić tylko TagLib. Ale masz rację, jeśli używasz tego tylko w jednym miejscu, to używanie '<% = książka? .pisywanie? .encodeAsHTML(). ReplaceAll ('\ n', '
')%>' może być najszybszym rozwiązaniem . – Antoine

+0

Musiałem dodać statyczne defaultEncodeAs = 'raw' do LinesTagLib i używać go jak (Grails 2.3.6) – CoPLaS

Powiązane problemy