为什么AngularJS在使用ng-bind-html时会去除数据属性
Why does AngularJS strip out data- attributes when using ng-bind-html?
我正在使用contentEditablediv来使用户能够格式化他们的文章。我对 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>
谢谢
如注释中所述,ng-bind-html
通过清理器传递数据。此清理器从其中传递的所有输入中删除许多属性。此问题可能有助于解释更多:有关白名单属性的 ngSanitize 问题。源代码的这一部分包括所有被认为有效的属性,因此ngSanitize不会触及这些属性。
虽然 Angular 和 ngSanitize 工作人员对此进行了整理,但我发现这个线程有助于创建解决方法。特别是,答案涉及动态定义的属性。
绑定到具有此类属性的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
,在这种情况下。
- 序列化数据属性中对象的最可靠方法
- jQuery最近父级的数据属性选择器
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 显示&作为&在jsp中使用angularjs而不使用ng-bind-html
- 数据属性仅在切换设备模式下工作
- 函数jquery.html()不提供数据属性集值
- 在数据属性上进行下拉自动选择
- JavaScript-获取数据属性的值返回未定义的值
- 如何替换数据属性中的特定字符串单词
- 使用数据属性将HTML数据复制到另一个元素
- 带有CSS的数据属性就没那么有用了
- 查找所有TD标签并读取其数据属性
- 使用jQuery获取第N个元素的数据属性值
- 使用自定义数据属性或将数据绑定到处理程序来处理事件
- 数据属性有没有更干净的方法
- ng-repeat / ng-bind 不会显示我的数据
- 为什么AngularJS在使用ng-bind-html时会去除数据属性
- ng-bind在API调用设置数据后不显示任何内容
- 在ng-bind-html中绑定ng-click::在HTML中绑定Angular属性
- 在angular中,不使用ng-model和ng-bind是否可以实现双向数据绑定?