3

我正在编写一段代码,要求DOM网站在任意 JavaScript 运行时保持冻结状态。属性更改很好,但我无法更改页面的原始标签结构!

我知道在 JavaScript 中有一个基本数量的函数可以修改DOM

appendChild( nodeToAppend )
cloneNode( true|false )
createElement( tagName )
createElemeentNS( namespace, tagName )
createTextNode( textString )
innerHTML
insertBefore( nodeToInsert, nodeToInsertBefore )
removeChild( nodetoRemove )
replacechild( nodeToInsert, nodeToReplace )

我最初的想法是简单地将这些函数覆盖为无操作:

>>> document.write('<p>Changing your DOM. Mwwhaha!</p>')
>>> document.write = function() {}
>>> document.write('<p>No-op now!</p>')

document虽然对对象执行此操作很容易,但DOM可以从许多不同的 JavaScript 对象调用修改函数!如果我可以在顶层覆盖这些函数,也许它会起作用?

来自 sktrdie 的更新:

>>> HTMLElement.prototype.appendChild = function(){}
>>> $("a").get(0).appendChild(document.createElement("div"))
# Still works argh.
>>> HTMLAnchorElement.prototype.appendChild = function(){}
>>> $("a").get(0).appendChild(document.createElement("div"))
# No-op yeah!

所以看起来我可以只收集所有DOM元素的构造函数并运行它们进行无操作,但这仍然看起来很混乱......

如何保护DOM任意 JavaScript 不被修改?

4

5 回答 5

2

您是否尝试过HTMLElement .prototype.appendChild = function(){} 在更高级别覆盖 DOM 方法?

于 2009-01-09T20:24:30.990 回答
1

虽然这确实很老套,但维护当前 DOM 结构的唯一方法是存储 DOM 的“快照”并定期检查它。

//place in anonymous function to prevent global access
(function() {
  //storing the whole DOM as objects would be ideal, but too memory intensive, so a string will have to do.
  var originalDOM = document.body.innerHTML;

  var checkDOM = function() {
    if (document.body.innerHTML != originalDOM)  document.body.innerHTML = originalDOM
    //check that the code is running
    if (arbitraryCodeIsRunning)  setTimeout("checkDOM", 100);
  }
  checkDOM();
})();

可能不是您要寻找的东西,但经过一些测试,这是我能想到的唯一维护 DOM 结构的方法。

于 2009-01-09T21:04:27.133 回答
0

不要这样做。使用白名单。请。

于 2009-01-09T19:47:32.920 回答
0

您可以将所有内容都放在一个<div>标签中,然后隐藏该标签,将其替换为另一个显示“正在加载...”的标签。然后在加载后,您可以隐藏加载<div>并将其替换为原始文件。

于 2009-01-09T19:47:57.723 回答
0

没有办法做到这一点。我做了几个测试,无论我如何尝试覆盖这些方法,它们仍然存在。我相信它们的实现比可执行的 javascript 可以访问的级别更高,因此您无法真正触摸它们。

于 2009-01-09T20:39:46.060 回答