5 Stimmen

Beibehaltung neuer Zeilen bei Verwendung des HTML-Codecs in Grails-Ansichten

Grails XSS-Prävention-Funktionalität ist ziemlich praktisch, so dass ich es mit aktiviert:

grails.views.default.codec = "html"

Dies führt jedoch zu einem Problem mit html textareas . Wenn wir eine textarea und die Eingabetaste zum Zeilenumbruch verwenden, werden neue Zeilen in der DB gespeichert, aber in der Ansicht ignoriert. Ich könnte verwenden <%=%> y replaceAll('\n',"<br>") um die Zeilenumbrüche zu korrigieren, aber der HTML-Code füllte die textarea würde nicht entkommen und es gäbe keinen XSS-Schutz!

Wie würden Sie dieses Problem umgehen?

10voto

Antoine Punkte 5059

Bevor Sie Ihre Textarea wieder in GSP rendern, könnten Sie

  • Ihre Zeichenkette als HTML kodieren
  • konvertiert Zeilenumbruchzeichen in <br/> .

Dies kann erreicht werden, indem die folgende Tag-Lib in grails-app/taglib gespeichert wird:

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

Da wir bereits encodeAsHTML() im Tag angewendet haben, müssen Sie den HTML-Codec deaktivieren, wenn Sie den Tag verwenden (mit <%=expression%> anstelle von ${expression} ):

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

Eine Alternative wäre, dass einen eigenen Codec schreiben dafür:

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

Sie können diesen Codec dann für GSP-Dateien verwenden, bei denen Sie dieses Verhalten wünschen, indem Sie eine Richtlinie hinzufügen:

<%@ defaultCodec="HTMLLines" %>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X