什么';What’从Meteor helper返回HTML的最佳/最安全/最有效的方法是什么?

什么';What’从Meteor helper返回HTML的最佳/最安全/最有效的方法是什么?,meteor,Meteor,我试图在满足某些逻辑条件后从助手函数返回HTML。但是,使用spacebar.SafeString()函数似乎不起作用,我推测使用此方法返回HTML是不安全的,并且容易从外部源注入代码 例如,返回此HTML: <object data="/rating/what.svg" width="20" height="20" type="image/svg+xml"></object> 设置如下: Spacebars.SafeString("<object data=

我试图在满足某些逻辑条件后从助手函数返回HTML。但是,使用
spacebar.SafeString()
函数似乎不起作用,我推测使用此方法返回HTML是不安全的,并且容易从外部源注入代码

例如,返回此HTML:

<object data="/rating/what.svg" width="20" height="20" type="image/svg+xml"></object>

设置如下:

Spacebars.SafeString("<object data=" + "/rating/what.svg" + "width='20' height='20' type=" + "image/svg+xml" + "></object>");
spacebar.SafeString(“”);

有人能告诉我从助手处返回HTML的最佳方法以及如何完成这样的任务吗?在其他地方找不到明确的答案。

您的空格键是正确的。SafeString()可以返回不安全的代码。最好的办法是去掉不需要的坏标记或注入,然后使用
空格键.SafeString()
或三大括号语法,如下所示:

<div>
  {{{htmlHelper}}}
</div>

htmlHelper: function() {
  return "<img src=..."
}

{{{htmlHelper}}}
htmlHelper:function(){

return“首先,如果您的需求允许,不要返回HTML,只需使用模板并使用数据上下文填充它,例如:

在模板中:

<template name="someHtml">
  <object data="/rating/{{dynamicName}}.svg" width="20" height="20" type="image/svg+xml"></object>
</template>
但是,如果您确实必须使用html内容进行打印,您可以使用两个最流行的消毒包之一,或者

首先:

cleanHtml = sanitizeHtml(dirtyHtml, {
  allowedTags: [ 'b', 'i', 'em', 'strong', 'a' ],
  allowedAttributes: {
    'a': [ 'href' ]
  }
});
对于后者:

cleanHtml = UniHTML.purify(dirtyHtml, {
  withoutTags: ['b', 'img'], 
  noFormatting: true
});

当然,您可以在模板中使用三个大括号中的任意一个来包含这些函数的返回值,这样HTML就不会转义。

在一个模板中,您的代码不能只在满足条件时呈现,并且具有动态注入的属性吗?类似于
{{{if condition}
{/if}这样你就不需要注入html。@是的,这就是我目前设置它的方式。但是如果可以通过一个助手和一个if标记来实现,它会更容易和更干净。目前我在html模板中有8个条件if标记。工作正常,但代码很多。
cleanHtml = UniHTML.purify(dirtyHtml, {
  withoutTags: ['b', 'img'], 
  noFormatting: true
});