2015-12-10 30 views
1

我试图在满足某些逻辑条件后从辅助函数返回HTML。但是,使用Spacebars.SafeString()函数似乎并没有工作,我认为使用此方法返回HTML是不安全的,并且很容易从外部源进行代码注入。什么是从流星帮助程序返回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>"); 

任何人都可以指导我从一个辅助返回HTML如何做最好的方式和这样的任务?无法在其他地方找到明确的答案。

+1

您是否可以在只有满足条件且已动态注入属性时呈现的模板中才拥有该代码?就像'{{#if condition}} '{{/ if}}这种方式不需要注入html。 – Shaded

+0

@Shaded是的,这就是我目前设置的方式。但如果可以通过一个助手和一个标签来完成,它会更容易和更清洁。目前我在HTML模板中有8个条件if标签。工作正常,但很多代码。 –

回答

1

首先,如果您的要求允许的话,在不返回HTML一切,只使用一个模板,并用数据上下文填充它,例如:

<template name="someHtml"> 
    <object data="/rating/{{dynamicName}}.svg" width="20" height="20" type="image/svg+xml"></object> 
</template> 
在相应的辅助

在模板

但是,如果你真的必须使用HTML内容进行打印时,可以使用两个最流行的消毒包之一,无论是djedi:sanitize-html-clientvazco:universe-html-purifier

随着第一:

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

,并与后者:

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

然后,当然你在模板中使用三个大括号包括这些返回值,以便HTML是n没有逃脱。

0

你是对的,Spacebars.SafeString()可以返回不安全的代码。最好的办法是去掉坏的标签或打针,你不想和任何使用Spacebars.SafeString()或三支柱的语法象下面这样:

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

htmlHelper: function() { 
    return "<img src=..." 
} 
相关问题