【问题标题】:Go template is adding extra quotes to outputGo 模板正在为输出添加额外的引号
【发布时间】:2020-09-13 08:00:33
【问题描述】:

我想在 Go 模板中按原样使用我的变量的值,但 Go 在它周围添加了额外的引号。例如,对于像

这样的 Go 模板

{{.Site}}:{{.Port}}/{{.Path}}

我想得到输出

Mysite:3000/from/here

但模板给了我以下内容:

"Mysite":"3000"/"from/here"

所以,

  • 我怎样才能解决它(去掉所有额外的引号或更好地暂停它们)?见https://play.golang.org/p/uKpgXdLv5gM
  • Go 模板也将"orgId=1&refresh=30s" 更改为orgId=1\u0026refresh=30s,如何避免?
  • 此外,如果我将https:// 添加到我的网址前面,输出将被截断。如何解决这个问题?
  • 最后,是否可以在“`”中转义“`”?

【问题讨论】:

  • 您是否尝试过使用普通的"? play.golang.org/p/D1uUcOHuQZu html/template 包对数据进行清理以避免注入。 docs 包含有关其功能的更多详细信息。
  • 谢谢@Marc,由于 JS 中的${othervars},我需要“`”。我只展示了一个,但是在JS字符串构建中我有很多。
  • 文档可能会告诉你怎么做,我还没有检查过。极端的解决方案是使用 text/template 包,但它不会清理任何东西。
  • 或使用 concat 函数。

标签: go-templates


【解决方案1】:

根据Go HTML template doc:

HTML 模板将数据值视为应编码的纯文本,以便它们可以安全地嵌入到 HTML 文档中。转义是上下文相关的,因此动作可以出现在 JavaScript、CSS 和 URI 上下文中。

此包使用的安全模型假定模板作者是受信任的,而 Execute 的数据参数不是。下面提供了更多详细信息。

这意味着只要 go HTML 模板引擎检测到它在 <script> 标记内,就会启用 JavaScript 转义(即,它与第一个评论者认为的是否使用常规 " 无关)。所以

得到输出为

Mysite:3000/from/here

代替:

"Mysite":"3000"/"from/here"

不要用<script> & </script> 标签包裹它。 在模板Execute()之后进行串联。

再一次,用<script> 和</script> 标签包裹,我得到:

var url = `"Mysite":"3000"/"from/here"/${othervars}?"orgId=1\u0026refresh=30s"`

对比没有 <script> 和 </script> 标签包裹它,我得到:

var url = `Mysite:3000/from/here/${othervars}?orgId=1&refresh=30s`

正是我需要的。

但是,我的实际情况是我正在使用 go HTML 模板引擎来处理我的 .html 模板文件,所以我不能真正在之后进行连接,因为所有内容都在 .html 模板文件中定义。因此,正如 Martin Gallagher 在他的代码中所展示的那样,对于这种情况,使用模板函数似乎是唯一的选择。

但即使这样也可能不是一个可行的选择,因为这是我从 Martin 的代码中得到的:

var url = "Mysite:3000\/from\/here?orgId=1\u0026refresh=30s"

这仍然不是我想要的:

var url = `Mysite:3000/from/here/${othervars}?orgId=1&refresh=30s`

所以也许这种情况,确实没有理想的解决方案。

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2015-09-10
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2012-09-23
    相关资源
    最近更新 更多