2015-12-10 31 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=..." 
} 
相關問題