2011-11-04 9 views
5

GrailsのXSS防止機能は非常に便利ですので、私が使用してそれを有効に新しい行を保持します。 textareaと入力して改行を解除すると、新しい行はDBに保存されますが、ビューでは無視されます。 <%=%>replaceAll('\n',"<br>")を使用して改行を修正できますが、textareaに埋め込まれたHTMLコードはエスケープされず、XSS防止はありません。は、GrailsのビューでHTMLコーデックを使用した場合

どのようにこの問題を回避しますか? GSPに戻ってあなたのテキストエリアをレンダリングする前に

答えて

10

は、あなたが

  • エンコードHTML
  • として、あなたの文字列が<br/>に改行文字を変換することができます。

これは、Grailsのアプリ/タグライブラリに次のタグのlibを保存することによって達成することができます。

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

我々はすでにタグでencodeAsHTMLを()適用されるように、あなたが使用している場合、HTMLコーデックを無効にする必要があります(<%=expression%>代わりに${expression}を使用して)タグ:

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

代替案は、になりは、そのための独自のコーデックを書く:

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

あなたは、あなたはディレクティブを追加することで、この振る舞いをしたいGSPファイルに対して、このコーデックを使用することができます。

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

ねえアントニー、お返事に感謝。私は中間的な解決策を思いついた。 encondingを "html"として扱い、テキストエリアを処理する方法については、<%= book?.description?.encodeAsHTML()。replaceAll( '\ n'、 '
')%>としてください。このソリューションには何らかの欠点がありますか? – Pomario

+1

あなたのソリューションはOKです。私はGSPのどこにでもそのような複雑なステートメントを置くのは好きではないので、TagLibを使う理由です。後で '

文字列

'で囲む場合は、TagLibを変更するだけです。しかし、あなたが正しいと思うのは、もしあなたが一箇所でしか使用しないなら、 '<%= book?.description?.encodeAsHTML()。replaceAll( '\ n'、 '
')%>'を使うのが最も速い解決法かもしれない。 – Antoine

+0

LinesTagLibに静的なdefaultEncodeAs = 'raw'を追加し、(Grails 2.3.6) – CoPLaS

関連する問題