为什么toStaticHTML删除data-*属性

Why does toStaticHTML remove data-* attributes

本文关键字:属性 data- 删除 toStaticHTML 为什么      更新时间:2023-09-26

我的应用程序将HTML内容动态构建为字符串,完成后将内容附加到DOM。然而,在WinJS中,一旦我尝试将字符串附加到DOM,就会抛出异常。为了解决这些异常,我必须通过运行toStaticHTML来清理HTML,它在WinJS和Internet Explorer中都有全局定义。我遇到的问题是,有很多数据-*html5属性的使用。一旦我把它们运行到StaticHTML,它们就会被剥离。为什么toStaticHTML删除data-*属性?他们真正关心的安全问题是什么?

请注意,我无法在MSApp.execUnsafeLocalFunction中包装DOM插入,因为我使用的是jQuery,并且不允许修改jQuery代码。

var html = "<ul><li data-role='list-node'>My list node</li></ul>";
$('#container').html(toStaticHTML(html));

产品:

<ul>
    <li>My list node</li>
</ul>

这是因为在文档中插入HTML的随机部分会引起安全问题,并可能允许不安全的代码在受保护的上下文(您的应用程序,可以完全访问WinRT和用户文档)中执行。

toStaticHtml旨在在HTML/web模式不断发展的情况下保持"安全",因此它是白名单,而不是黑名单

考虑到你在这里面临的挑战,我看到了以下选择:

  • 将对jquery的调用封装在msExecUnsafeLocalFunction中(见下文)。这意味着在这个调用的生命周期内,所有Dom插入都会很好。这不需要更改jquery,只需要您的代码
  • 完全重写Jquery在幕后使用的任何DOM调用,以使用msExecUnsafeLocalFunction进行调用
  • 将应用程序的安全上下文更改为web上下文,而不是本地上下文。当然,这将使您无法直接访问WinRT。您必须通过其他机制(I帧之间的消息传递或类似机制)进行操作
  • 使用WinJS.Binding.Template而不是Jquery来呈现内容。这将克隆节点,而不是字符串化HTML
  • 编写自己的节点克隆器
  • 插入安全节点后,使用setAttribute设置属性

msExecUnsafeLocalFunction的示例用法:

MSApp.execUnsafeLocalFunction(function() {
    $('#container').html(html);
});

此处未列出data-role-属性:http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

这是一个未知属性,将被删除。

不允许在文档data中提及:http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx