为什么AngularJS在使用ng-bind-html时会删除数据属性?

时间:2014-12-07 22:20:10

标签: javascript html angularjs escaping

我正在使用contentEditable div来让用户格式化他们的文章。我对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>

这是文章标签内的Angular输出(注意剥离的数据属性):

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

由于

2 个答案:

答案 0 :(得分:3)

如评论中所述,ng-bind-html通过清理程序传递数据。此清理程序从其中传递的所有输入中删除了许多属性。此问题可能有助于解释更多:ngSanitize issue concerning whitelisting attributes。此part of the source code包含所有被视为有效的属性,因此不会受到ngSanitize的影响。

答案 1 :(得分:0)

当Angular和ngSanitize工作人员对此进行排序时,我发现this thread helpful创建了一个解决方法。特别是,答案是针对动态定义的属性

使用这样的属性绑定到is-open,我可以在 ngSanitize完成清理后在锚标记上附加点击处理程序。

这是清理后的HTML,请注意我使用cite来存储目标锚ID,因为它是ngSanitize忽略的属性之一。 (您可以尝试使用href,但我想单独留下它:

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

属性的setter中的代码(参见上面引用的SO)然后操作DOM事件,我认为这些事件与Angular方法相反,但有时候你必须停止敲打头并让它工作:

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

然后确保您拥有目标ID为#another_faq的正确锚点,在这种情况下。