我正在使用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>
由于
答案 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
的正确锚点,在这种情况下。