【问题标题】:Getting the "unmodified" HTML document from Javascript从 Javascript 获取“未修改”的 HTML 文档
【发布时间】:2010-06-13 13:55:55
【问题描述】:

是否有可能以文本形式获取当前 HTML 文档的源代码,与加载时完全相同? (即不是解析和 DOM 操作后的“生成源”。)

注意:在这种情况下,不能再发出额外的 AJAX 请求来检索 HTML 页面:文档可能已更改。

大多数浏览器都具有“查看源代码”功能,它可以提供我想要的内容 - 因此浏览器无论如何都会保留原始 HTML 内容。如果我能访问它,那就太好了......

【问题讨论】:

  • 在 window.onload 上抓取它是一个选项吗?
  • @Gert - 即便如此,它也可以进行大量修改,至少 <head> 中的所有脚本都已经运行了。
  • @Gert 它必须与下载的文档逐个字符相同。
  • 好点尼克。那我就看不到了。

标签: javascript html


【解决方案1】:

你不能用 JavaScript 做到这一点,浏览器没有责任真正保存原始文档。是否可以选择带有时间戳的 AJAX 请求?如果历史可用,您可以使用new Date() 存储页面的加载日期,并在再次请求文档时将此时间戳传递给服务器。

除此之外...我不确定您将如何使用 JavaScript/HTML 执行此操作。你的实际最终目标是什么?您是否看到 <form> 及其输入是否发生了变化,或者其他什么?

【讨论】:

  • 我正在考虑使攻击者更难修改页面(通过操纵 HTTP 流量)的可能性。我会构建它的 MD5 总和,并让通过 HTTPS 加载的 JavaScript 进行检查。这只是一个粗略的想法——我真的不知道,如果我能做到这一点......(由于 SOP 问题,页面本身必须通过 HTTP 加载,但可以在这样的页面中包含 HTTPS 脚本! )
  • @chris_l - 使用 http/https,您可能会遇到一些跨域问题...我会真的按 SOP 更改。我现在的雇主是通过 ISO 认证的,我们受到同样的限制,但每次都为了整体利益而改变他们是值得的。您可以在页面中放置一个哈希值,以验证服务器上的某些内容、更改每个负载的 IP/会话变量等……但这些都不能真正防止中间人攻击。 HTTPS/SSL 绝对是您的最佳选择,如果您能够推动该 SOP 发生变化。
  • @Nick:哦,我的意思是“Same Origin Policy”,而不是“Standard Operating Procedure”——我刚刚意识到这个缩写的歧义...... :-) 恐怕,我不能t 改变这一点:必须包含来自外国 HTTP 页面的图像(我无法将它们复制到我自己的服务器)。
  • @chris_l - 图像很好,只要脚本/页面本身来自相同的方案/域,这就是所有会受到影响的东西,尝试通过 HTTPS 的页面和脚本,如果图像使用 HTTP必要的,不应该是同源的问题。
  • @Nick:在 HTTPS 页面上拥有 HTTP 图像要求用户单击“此页面包含不安全元素 - 你想显示这些元素是/否”这样的消息框 - 不能那个(而且我也不想训练人们点击离开警告)......
【解决方案2】:

据我所知,没有办法这样做。

可以尝试很早获取 HTML 并将其存储在变量中,但这是一个非常糟糕的选择,因为:

  • 如果 非常早 太早(在所有 DOM 节点加载之前),您将在尝试获取 innerHTML 属性时遇到麻烦
  • 如果 非常早 是当 DOM 准备好进行操作时,可能已经为时已晚(如果您有 <script>document.write(stuff);</script> 之类的东西,您可能已经看到 HTML 内容的不同视图)

使用 AJAX 重新获取文档,尽管有许多可能的影响,但可能是您解决此问题的最佳选择。

【讨论】:

    【解决方案3】:

    一个非常糟糕的破解方法是仅使用 JS 加载页面。使用单个 AJAX 调用加载空白页面以获取页面的实际内容。

    但是,在这样做之前,我会重新考虑您要做什么以及为什么需要“已保存状态”。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2015-08-14
      • 2013-12-10
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多