2011-11-04 58 views
5

Grails的XSS防護功能也很方便保存新的生產線,所以我啓用它使用:在使用Grails中的HTML編碼解碼器觀看

grails.views.default.codec = "html" 

雖然,這將創建HTML textareas問題。如果我們完成一個textarea並使用Enter斷開線條,則新線條將保存在數據庫中,但它們在視圖中將被忽略。我可以使用<%=%>replaceAll('\n',"<br>")修復換行符,但填入textarea的HTML代碼不會被轉義,並且不會有XSS預防!

你將如何解決這個問題?

回答

10

渲染你的textarea早在GSP之前,你可以

  • 編碼的字符串作爲HTML
  • 換行字符轉換爲<br/>

這可以通過保存下列標記庫到的grails-app /標籤庫來實現:

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

嘿安東尼,感謝您的回覆。我想出了一箇中介解決方案。你怎麼說保留引用爲「html」,但處理我的textareas:<%= book?.description?.encodeAsHTML()。replaceAll('\ n','
')%>。你看到這個解決方案的缺點嗎? – Pomario

+1

您的解決方案看起來不錯。我不喜歡在我的GSP中到處都有這樣複雜的聲明,這就是爲什麼我會使用TagLib。如果稍後您決定要在'

字符串

'中附加行,則只需更改TagLib。但是你是對的,如果你只在一個地方使用它,那麼使用'<%= book?.description?.encodeAsHTML()。replaceAll('\ n','
')%>'可能是最快的解決方案。 – Antoine

+0

我不得不將靜態defaultEncodeAs ='raw'添加到LinesTagLib中,並像(Grails 2.3.6) – CoPLaS