为什么html / template没有显示所有html条件注释?

时间:2013-12-16 12:19:13

标签: html templates go

我有一个简单的Go HTML模板,其中包含HTML条件注释:

package main

import (
    "html/template"
    "os"
)

var body = `<!doctype html>
<html>
  <head>
    <!--[if !IE]><!--><script src="http://code.jquery.com/jquery-2.0.3.min.js"></script><!--<![endif]-->
    <!--[if gte IE 9]><script src="http://code.jquery.com/jquery-2.0.3.min.js"></script><![endif]-->
    <!--[if lt IE 9]><script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><![endif]-->

  </head>
</html>`

func main() {
    tmp := template.Must(template.New("tmp").Parse(body))
    tmp.Execute(os.Stdout, nil)

}

This produces:

<!doctype html>
<html>
  <head>
    <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>



  </head>
</html>

为什么html/template在编译后会删除这些条件注释?

5 个答案:

答案 0 :(得分:9)

我的解决方法是重新实现在提交#938597eab997

上删除的 noescape 帮助程序
funcMap := template.FuncMap{
    "noescape": func(s string) template.HTML {
        return template.HTML(s) 
    },
}

然后在模板中使用它:

<!DOCTYPE html>
{{noescape "<!--[if lt IE 9]>"}}<html class="old-ie">{{noescape "<![endif]-->"}}

答案 1 :(得分:5)

由于你的问题是为什么,我会尝试解释为什么评论会被删除。

首先,html/template包的目的是安全documentation州:

  

包模板(html / template)实现了数据驱动模板,用于生成HTML输出,以防止代码注入。

这是通过上下文敏感的转义来完成的。在Golang-nuts thread Kyle Lemons中提供了一个例子,除非评论被删除,否则条件评论目前会破坏这种安全性:

<p>
<!--[if lt IE 9]><script><![endif]-->
{{.Stuff}}
<!--[if lt IE 9]></script><![endif]-->
</p>

在这种情况下,{{.Stuff}}中的任何值都将在某些浏览器上作为Javascript执行,因此应该转义为安全的。这将要求模板引擎知道注释的这种特定于浏览器的解释,以及所有浏览器中的任何其他非标准行为。这是不可行的。

相反,html/template旨在消除任何评论,以确保它产生的HTML不会受到任何注入攻击。

解决方法

如Dave所述,可以使用template.HTML插入此类注释。但是,由于存在安全风险,template.HTML状态documentation(我强调):

  

HTML封装了一个已知的安全HTML文档片段。它不应该用于来自第三方的HTML,或者带有未关闭标签的HTML或评论

答案 2 :(得分:1)

看来golang-nuts集团讨论了这个问题:
https://groups.google.com/forum/#!msg/golang-nuts/8y6by6SERyU/XQRnbw3aBhwJ

TL; DR
转到所有html通知的html/template条,并且不解释条件注释,因为它们不是标准的一部分。

此外,{{noescape}}指令已被删除:http://code.google.com/p/go/issues/detail?id=3528

答案 3 :(得分:0)

条件评论仅受Internet Explorer支持,不属于我能找到的任何标准。

来自Wikipedia

  

条件注释是Microsoft Internet Explorer在HTML源代码中解释的条件语句。条件注释可用于在Internet Explorer中提供和隐藏代码。

     

HTML [1]中的条件注释首先出现在Microsoft的Internet Explorer 5浏览器中,尽管现已不再支持。在Internet Explorer 10中,当页面处于标准模式(文档模式10)时,不支持HTML条件注释

答案 4 :(得分:0)

添加几个将HTML注释添加到html / template输出的示例:

1)使用HTML类型添加评论: http://play.golang.org/p/mYj4rxVfHW

2)使用添加的noescape函数(返回HTML): http://play.golang.org/p/y61Hysfs3Y