【问题标题】:Why does toStaticHTML remove data-* attributes为什么 toStaticHTML 删除 data-* 属性
【发布时间】:2012-09-02 09:47:28
【问题描述】:

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

请注意,我无法将 DOM 插入包装在 MSApp.execUnsafeLocalFunction 中,因为我使用的是 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>

【问题讨论】:

  • $('#container').html(html) 不起作用? html 无论如何都是一个字符串...

标签: javascript jquery html internet-explorer winjs


【解决方案1】:

这是因为将 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);
});

【讨论】:

  • 我相信我尝试将我的调用包装在 MSApp.execUnsafeLocalFunction 中,但是我仍然遇到异常。我必须在星期一确认。
  • 如果 JQuery 工作是“延迟的”,例如执行是在实际设置之前交给浏览器的,那么这可以解释这一点。查看代码,这似乎没有发生。更新以添加另一个选项。
  • 实际上 jQuery 在这种情况下应该使用它的 Deferred。事实上,在某些情况下,只有当我使用 MS Promise 时我才会收到错误,如果我不这样做,我不会收到任何错误,而是会收到警告。明天我会更新进一步的发现。
  • 我已经更新了我上面的帖子。也许将所有实现更改为使用 attr (setAttribute) 就足够了,但是如果可以不这样做,因为我需要修改代码的大小,那就更好了。
  • 您的编辑没有调用里面的函数。您调用 JSQuery 函数,并将结果传递给 msExecUnsafeLocalFunction。让我添加一个例子。
【解决方案2】:

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

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

【讨论】:

  • 我仍然看不出为什么所有 data-win-* 属性都被允许而其他 data-* 不被允许的原因。其余的安全问题是什么?
  • 好吧,我想标准信息:这里没有适用的标准。 @msdn.microsoft.com/en-us/library/windows/apps/hh466094.aspx 提供了线索。
  • @Konstantin Diev:不允许“所有”数据-win-*-属性,仅列出。
  • 在这种情况下,我的问题可以改写为“当我尝试将 html 字符串附加到包含 data-* 属性的 DOM 时,为什么在 WinJS 中会出现异常,因为按照规范它们不应该是安全问题?”:dev.w3.org/html5/spec/…*-attributes
  • w3c 规范在这里毫无意义。
【解决方案3】:

正如文档中提到的那样,data 是不允许的:http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

【讨论】:

  • 如果提到数据属性,我可以确认允许动态插入这些属性,而无需采取额外措施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2015-05-16
  • 2017-12-24
  • 2022-11-17
  • 2016-08-24
  • 2011-10-20
  • 1970-01-01
相关资源
最近更新 更多