2014-12-07 20 views
6

我正在使用contentEditable div來使用戶能夠格式化他們的文章。我對html內容做了一些處理並堅持下來。爲什麼AngularJS在使用ng-bind-html時去除數據屬性?

我正在使用ng-bind-html在觀看者想要閱讀文章時呈現結果。我不想使用$sce.trustAsHtml,因爲我仍然希望AngularJS消毒用戶輸入,因爲我不信任所有輸入。我想要的只是AngularJS消毒功能允許元素具有某些屬性。它似乎剝離了ID和數據屬性。 (但保持課堂和標題)。

數據屬性是否被認爲是有害的?攻擊者如何使用它們來攻擊最終用戶?有沒有一種方法可以安全地使用它們,並讓Angular不會將它們剝離出來?

下面是一個例子:

article.body = '<p data-guid="afasfa-afasfafas-faf-asasf" class="guid-tagged">Yes this is my article</p>'; 
<article ng-bind-html='article.body'></article> 

下面是文章標籤內角輸出(注意去掉了數據 - 屬性):

<p class="guid-tagged">Yes this is my article</p> 

感謝

+4

衛生洗滌劑具有允許屬性的硬編碼列表,這意味着沒有內置功能來添加您自己的屬性,並且默認情況下會刪除數據屬性。你cak檢查源代碼https://github.com/angular/angular.js/blob/master/src/ngSanitize/sanitize.js – jornare 2015-02-20 15:29:25

回答

0

雖然Angular和ngSanitize工作人員對此進行了整理,但我發現this thread helpful可以創建解決方法。具體來說,回答說一個動態定義的屬性

綁定到is-open與這樣的屬性,我能夠附加點擊處理程序在錨標記 ngSanitize已完成消毒。

以下是清除後的HTML,請注意,我使用cite來存儲目標錨點ID,因爲它是ngSanitize忽略的屬性之一。 (你可以嘗試使用href但我想單獨留下):

Please see <a href='#' cite='#another_faq'>here</a>

在二傳手的屬性的代碼(見SO上面提到的)然後操縱我相信這是反DOM事件該角的方法,但有時你必須停止敲打你的頭,並得到它的工作:

if (isOpened) $('p.faq.answer').eq(item.position).find('a[cite]').each -> $(this).bind 'click',() -> $($(this).attr('cite')).click()

然後確保你有一個的#another_faq目標ID正確的錨,在這種情況下。

相關問題