Grails XSS预防功能非常方便,因此我使用以下方法启用它:
grails.views.default.codec = "html"
但是,这会导致html textareas
出现问题。如果我们完成textarea
并使用Enter来断行,则新行将保存在数据库中,但在视图中会被忽略。我可以使用<%=%>
和replaceAll('\n',"<br>")
来修复换行符,但textarea
中填写的HTML代码不会被转义,也不会有XSS预防!
你将如何解决这个问题?
答案 0 :(得分:10)
在将您的textarea渲染回GSP之前,您可以
<br/>
。 这可以通过将以下标记lib保存到grails-app / taglib:
来实现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" %>