【问题标题】:How to stop Ember.Handlebars.Utils.escapeExpression escaping apostrophes如何阻止 Ember.Handlebars.Utils.escapeExpression 转义撇号
【发布时间】:2015-06-13 16:01:45
【问题描述】:

我对 Ember 还很陌生,但我使用的是 v1.12 并且正在努力解决以下问题。

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

我遵循的范例是:

  1. 使用Ember.Handlebars.Utils.escapeExpression(value); 转义输入文本
  2. 做逻辑
  3. 使用Ember.Handlebars.SafeString(value);

但是,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 是一个函数,它使用正则表达式来查找和替换主题标签或用户名。例如,如果给它#emberjs foo,它将返回<a href="blah">#emberjs</a> foo

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

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    escapeExpression 旨在将字符串转换为表示形式,当插入到 DOM 中时,带有浏览器翻译的转义序列,将产生原始字符串。所以

    "1 < 2"
    

    转换成

    "1 &lt; 2"
    

    当插入 DOM 时显示为

    1 < 2
    

    如果将"1 &lt; 2" 直接插入到DOM 中(例如innerHTML),会造成相当大的麻烦,因为浏览器会将&lt; 解释为标签的开头。

    所以escapeExpression 转换与符号、小于号、大于号、直单引号、直双引号和反引号。文本节点不需要引号的转换,但可以用于属性值,因为它们可以包含在单引号或双引号中,同时也包含此类引号。

    这是使用的列表:

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

    我不明白为什么引号的转义会给您带来问题。大概您正在执行escapeExpression,因为您希望在使用普通双隐藏{{}} 输出到模板时正确显示诸如&lt; 之类的字符。完全相同的事情也适用于引号。它们可能会被转义,但是当字符串显示时,它应该可以正常显示。

    也许您可以提供有关输入和所需输出的更多信息,以及如何“打印”字符串以及在什么情况下您不想看到转义引号。

    【讨论】:

    • 感谢您的回复和解释。我添加了一些示例代码和示例,希望对您有所帮助。
    • 在您的情况下,在调用escapeExpression 之前调用addUrls 不是正确的方法吗?您不希望 addUrls 必须处理转义字符串。
    • 但是addUrls添加的链接会转义为文本而不是链接?
    • 提供所需输入和输出的具体示例。
    • "太好了!#cool" -> "太好了!twitter.com/search?q=%23cool">#cool</a>"
    猜你喜欢
    • 2017-04-05
    • 2013-07-13
    • 2012-03-24
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多