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

时间:2011-11-04 12:06:44

标签: grails xss

Grails XSS预防功能非常方便,因此我使用以下方法启用它:

grails.views.default.codec = "html"

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

你将如何解决这个问题?

1 个答案:

答案 0 :(得分:10)

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

  • 将您的字符串编码为HTML
  • 将换行符转换为<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" %>