【问题标题】:How to encodeAsHtml in a javascript file in a grails project如何在 grails 项目的 javascript 文件中编码 AsHtml
【发布时间】:2018-01-24 11:51:31
【问题描述】:

我有一个 grails 项目,其 UI 主要是在 javascript(BackBone.js) 中实现的。 简而言之,我有一个包含 javascript 文件的 gsp 文件。 gsp 页面的事件由 Javascript 文件中定义的处理程序处理。

现在我在 javascript 文件中有一些 DOM XSS 违规。 例如。 cell1.innerHTML = '<div name="caCertFileName">' + item.fileName.substring(33) + '</div>';

现在我无法理解如何在 javascript 文件中使用 encodeAsHTML / encodeAsJavascript 功能。 我需要一个简短的例子来解决这个问题。

【问题讨论】:

  • 你不能在 javascript 文件中使用 encodeAs 的东西,但你可以在给定 GSP 的 javascript 段中使用(这将命中 grails 并被处理),据我所知,你的静态 js 文件不是。选择是将该处理程序移动到 gsp 或集中式 gsp 并尝试在那里围绕脚本包装器进行编码 - 或者可能查看可能导致问题 item.fileName?.substring(33) 位的项目编码您应该将该特定内容传递给将 item.fileName.substring(33) 作为变量处理的后端 javascript 函数
  • 这与您的另一个问题本质上是相同的问题,但在混合了服务器端/客户端语言混淆的情况下提出了不同的表述。

标签: javascript html grails backbone.js xss


【解决方案1】:

你可以定义 JavaScript 函数来做 html 转义,并像这样使用它:

cell1.innerHTML = '<div name="caCertFileName">' + encodeHtml(item.fileName.substring(33)) + '</div>';

使用encodeHtml 之类的函数将< 之类的字符转换为<,并且将数据插入标签之间而不是标签内部,这可以工作。

有关实现,请参阅:Can I escape html special chars in javascript?

您最好避免使用innerHTML,并使用 DOM 操作函数。以jQuery 为例,您可以这样写:

$(cell1).append($("<div>")
    .attr("name", "caCertFileName")
    .text(item.fileName.substring(33)));

这样可以将 HTML 结构和用户数据分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2015-06-05
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多