首页 > 解决方案 > 安全问题:使用 XMLHttpRequest 解析 HTML?

问题描述

主要问题

XMLHttpRequest使用、 using解析 HTML 文件是否responseType = "document"存在潜在的安全问题?

示例可以在 MDN 上找到:XMLHttpRequest 中的 HTML

设置时documentType = "document",它会尝试将 url(在我们的例子中是 HTML 文件)解析为 DOM 节点,并检索它。

假设我们有一个中间人攻击的情况(即不使用 HTTPS),并且 HTML 文件被换出。我们有风险吗?

奖金问题

假设我们正在加载 JSON 文件而不是 HTML 文件。使用documentType = "text"和 一样安全JSON.parse吗,即不评估代码?

标签: javascripthtmlsecurityxmlhttprequest

解决方案


我不是开发人员,而是安全从业者,所以请原谅任何不准确之处。我的简短回答是肯定的,当您获取和解释外部数据时,会有安全风险。这不仅适用于 HTML,而且在解析 XML 或包含通过解释器的任何形式的内容时也是如此。例如,在 AJAX 中,XMLHttpRequest 结果可能代表用户执行某些操作。如果文件被换出,可能会发生类似的事情。

在构建应用程序时,您将无法消除所有风险,但您希望将其降低到可接受的水平。例如,不要包含外部代码,而是自己托管代码。

这也适用于您的 XMLHttpRequest 提取 - 数据来自哪里?第三方和跨域带来了更多风险。如果可以,请避免。您应该考虑通过策略阻止跨源资源共享,尽管 Access-Control-Allow-Origin。HTTPS 也不能消除风险,因为您可能无论如何都无法信任第三方,并且 HTTPS 并不能完全消除 MIM 攻击。

但是,如果您正在获取您自己托管的东西并且有一个值得信赖的渠道来获取,您可能会争辩说剩余的风险很小。

至于奖金问题,我不确定这是否会有很大的不同。我假设使用 documentType = "text" 您最终会得到一长串实际上是 HTML 文档的文本。然后呢?如果您仍打算解析它,脚本可能会运行。JSON.parse 是一个文本解析器,它不会加载脚本,但据我所知,您需要将自己暴露在 HTML 解析中。解决方案可能是确保您可以信任来源。


推荐阅读