2009-01-09 63 views
1

我正在写一段代码,要求网站的DOM在任意JavaScript运行时保持冻结状态。属性改变是好的,但我不能有任何东西改变页面的原始标签结构!将DOM冻结为JavaScript:将DOM修改函数覆盖为空操作

我知道在JavaScript中有功能的基数,可以修改DOM

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

我最初的想法是简单地覆盖这些功能,因为没有OPS:

>>> 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的修改?

+0

哇。你在做什么?真的很好奇。 – 2009-01-09 19:48:01

+0

我有一个代理网页显示网站的iFrame。然后,您可以使用我注入的JavaScript选择网站的各个部分 - 我从您选择的内容中抓取CSS选择器。所以`DOM`需要保持不变或者选择器会中断(但其他JavaScript应该像平常一样运行!) – 2009-01-09 19:53:19

回答

2

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

0

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

0

您可能会将所有内容放在<div>标记中,并隐藏该标记,将其替换为另一个标记为“加载..”的标记。然后,它已经加载后,你可以隐藏加载<div>并将其替换为原来的。

0

没有办法做到这一点。我做了一些测试,不管我怎么试图覆盖他们保留的这些方法。我相信它们是在比可执行的JavaScript更高的层次上实现的,所以你不能真正触及它们。

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结构无关的唯一途径。