在Grails视图中使用HTML编解码器时保留新行

Pom*_*rio 5 xss grails

Grails XSS预防功能非常方便,所以我使用它启用它:

grails.views.default.codec = "html"
Run Code Online (Sandbox Code Playgroud)

但是,这会产生html的问题textareas.如果我们完成textarea并使用Enter来断行,则新行将保存在数据库中,但在视图中会被忽略.我可以使用<%=%>replaceAll('\n',"<br>")修复换行符,但填写的HTML代码textarea不会被转义,也不会有XSS预防!

你会如何解决这个问题?

Ant*_*ine 10

在将您的textarea渲染回GSP之前,您可以

  • 将您的字符串编码为HTML
  • 将换行符转换为<br/>.

这可以通过将以下标记lib保存到grails-app/taglib来实现:

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

由于我们已经在标记中应用了encodeAsHTML(),因此在使用标记时必须禁用HTML编解码器(使用<%=expression%>而不是${expression}):

    <g:lines string="<%=savedTextarea%>" />
Run Code Online (Sandbox Code Playgroud)

另一种方法是为此编写自己的编解码器:

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

然后,您可以通过添加指令将此编解码器用于您希望此行为的GSP文件:

<%@ defaultCodec="HTMLLines" %>
Run Code Online (Sandbox Code Playgroud)