如何阻止Ember.Handlebars.Utils.escapeExpression转义撇号

时间:2015-06-13 16:01:46

标签: ember.js

我对Ember很新,但是我在v1.12并且遇到了以下问题。

  • 我正在制作模板助手
  • 帮助程序在主题标签和用户名周围使用推文和HTML锚点的主体。

我关注的范例是:

  1. 使用Ember.Handlebars.Utils.escapeExpression(value);来转义输入文本
  2. 做逻辑
  3. 使用Ember.Handlebars.SafeString(value);
  4. 然而,1。似乎逃避了撇号。这意味着我传递给它的任何句子都会被转义。我怎样才能避免这种情况,同时确保我没有引入潜在的漏洞?

    编辑:示例代码

    export default Ember.Handlebars.makeBoundHelper(function(value){
      // Make sure we're safe kids.
      value = Ember.Handlebars.Utils.escapeExpression(value);
      value = addUrls(value);
      return new Ember.Handlebars.SafeString(value);
    });
    

    其中addUrls是一个使用RegEx查找和替换主题标签或用户名的函数。例如,如果给它#emberjs foo,它将返回<a href="blah">#emberjs</a> foo

    上述辅助函数的结果将显示在Ember(HTMLBars)模板中。

1 个答案:

答案 0 :(得分:0)

escapeExpression用于将字符串转换为表示形式,当插入DOM时,由浏览器转换的转义序列将生成原始字符串。所以

"1 < 2"

转换为

"1 &lt; 2"
插入DOM时的

显示为

1 < 2

如果将"1 < 2"直接插入到DOM中(例如使用innerHTML),则会导致相当多的麻烦,因为浏览器会将<解释为标记的开头

所以escapeExpression转换&符号,小于符号,大于符号,单引号,直双引号和反引号。引号的转换对于文本节点不是必需的,但可以用于属性值,因为它们可以用单引号或双引号括起来,同时也包含这样的引号。

以下是使用的列表:

var escape = {
  "&": "&amp;",
  "<": "&lt;",
  ">": "&gt;",
  '"': "&quot;",
  "'": "&#x27;",
  "`": "&#x60;"
};

我不明白为什么逃避引号会导致你出现问题。假设您正在执行escapeExpression,因为您希望在使用普通双存储<输出到模板时正确显示{{}}等字符。引号也同样适用。它们可能会被转义,但是当显示字符串时,它应该显示正常。

也许您可以提供有关输入和所需输出的更多信息,以及您如何&#34;打印&#34;当你不想要时,字符串和你在什么情况下看到逃脱的引号。