【问题标题】:Grails Resources Plugin encoding issue with code = html代码 = html 的 Grails 资源插件编码问题
【发布时间】:2013-12-19 23:41:36
【问题描述】:

根据马克·帕尔默的说法

Preventing XSS attacks

简而言之,保护您的应用免受代码注入 XSS 攻击 你必须:

将配置中的默认 grails.views.default.codec 设置为“HTML”

好的。 因此,如果我的 Config.groovy 中有以下内容

grails.views.default.codec = "none"

在我的控制器中,我添加:

def afterInterceptor = { model ->   
    model.headerJs = "alert('bingo for '+[$params.unitId]);"
}

在我的 GSP 中:

<r:script disposition="head">${headerJs}</r:script>

它有效。我在查看源代码时看到了预期的 javascript 警报,并在页面提供时收到了警报。

但是,如果我在 Config.groovy 中应用建议的更改:

grails.views.default.codec = "html"

我的 GSP 呈现

<script type="text/javascript">alert(&#39;halooba for &#39;+[1]);</script>

我可以看到非常安全。

我使用这个应用程序的目标是在域中为客户存储自定义 JS sn-ps、各种属性和其他值。这些值将由我们的管理员(而不是客户)输入。根据谁使用 HTTP 请求调用页面,例如 www.mydomain.com/ThisApp/?customerId=13423 (但编码的 customerId),我将从我的控制器调用服务以获取客户的相关设置域并将它们注入 GSP。

我知道我可以将 JS 和 CSS 放入文件中,然后使用 Resources Plugin 将它们正确导入,但我也在研究这种方法以进行特定的自定义。

因此,要遵循这种安全方法,我需要能够取消编码,或者我需要确定另一种方法,将 javascript 包含到不对其进行编码的 GSP 中。

有什么建议吗?

谢谢!

【问题讨论】:

  • 问题需要由code=html改为codec=html

标签: grails character-encoding


【解决方案1】:

您可以使用 GSP 中的raw() 来建议 Grails 不要逃逸:

<r:script disposition="head">${raw(headerJs)}</r:script>

【讨论】:

  • 好。但我的项目正在运行 2.2.4。我正在尝试将其升级到 2.3.4,但在使用 org.grails.plugins: tomecat: 2.3.4 和 org.grails.plugins:hibernate:2.3.4 解决依赖错误时遇到了失败。在 2.3 之前有类似 raw() 的方法吗?
  • 这不起作用:&lt;r:script disposition="head"&gt;${headerJs.decodeHTML()}&lt;/r:script&gt;
  • 如果我的应用程序可以与 Grails 2.3.4+ 一起使用,这个解决方案可能会奏效。但现在,我在 2.2.4 上。尝试升级,但在依赖问题地狱一个小时后放弃了。
  • RAW() 在 中不起作用 @dmahapatro 因此,raw() 在 中的常规 html 标记中起作用。但在 部分,它只呈现转义。
  • 获取 RAW() 工作在 中的解决方法这将呈现值而不对其进行编码:&lt;sometag&gt;${raw(new org.codehaus.groovy.grails.web.pages.FastStringWriter().append(headerJs).buffer)}&lt;/sometag&gt; 其中 headerJs 是您要呈现的内容。
【解决方案2】:

对于 Grails 2.2.x 及以下版本,您可以将推荐的编码放入 Config.groovy:

grails.views.default.codec = "html"

并使用 Taglib 引入安全且不应进行 HTML 编码的值:

<r:script><com_myapp:getJSDeferred  unitId="${params.unitId}" /></r:script>

它会被渲染成原始的。

【讨论】:

    【解决方案3】:

    仅供参考:上述解决方案不允许将 JSON 输出分配给 javascript 变量。 我的解决方法,假设您将 model.data 定义为 hashmap:

    var someVar= ${raw(data as JSON).toString())};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2014-11-12
      • 2012-04-10
      • 2011-05-25
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多