用Javascript对象替换窗口或文档对象

用Javascript对象替换窗口或文档对象,javascript,dom,Javascript,Dom,有没有办法替换“窗口”或“文档”对象?我基本上想要的是提供某种JavaScript代理,我想要阻止用户在页面上获取“some”(只有some!这很重要)DOM元素。我所说的“用户”是指任何第三方脚本 我可以这样做: document.getElementsByTagName("a") //NodeList[129] document.getElementsByTagName = function(){} //function (){} document.getElementsByTagName(

有没有办法替换“窗口”或“文档”对象?我基本上想要的是提供某种JavaScript代理,我想要阻止用户在页面上获取“some”(只有some!这很重要)DOM元素。我所说的“用户”是指任何第三方脚本

我可以这样做:

document.getElementsByTagName("a")
//NodeList[129]
document.getElementsByTagName = function(){}
//function (){}
document.getElementsByTagName("a")
//undefined
但是对于
document.all我能做些什么呢
如何替换DOM对象字段,使其只返回“部分”DOM元素

UPD:如果有一种方法可以用一些JavaScript对象替换“document”对象,这会更好

UPD2:我不在乎你的方法是否在“旧”浏览器上不起作用。所以我对任何对“A”评分员有效的解决方案都很在行

UPD3:我知道JavaScript中不存在100%的安全性,我不想阻止黑客进行“黑客攻击”,我知道这是不可能的,我想阻止为我的“自制”框架编写“插件”的开发人员做愚蠢的事

UPD4:好的,我不能替换文档或窗口,但我至少可以替换所有可用于返回“DOM”元素的“字段”或“函数”吗?比如“document.getElementById”或“document.all”

UPD5:用户
@pebbl
建议了一些“接近”我想要的东西

function a(window, document){
   /// in here window and document should be numerics
   alert(window);
   alert(document);
}

a(123,456);
但他的解决方案有一个大问题

UPD6-7:这是“完美”的一款(至少对我而言)

function Fx(){return function(){}
这个(那个){
如果(该==窗口){
返回假窗口;
}else if(该=文档){
归还伪造文件;
}否则{
归还;
}
}
var fakeDocument={
write:function(a){document.write(a)}
}
var fakeWindow={
文件:伪造文件
}
var moduleA=函数(函数、窗口、文档、评估){
文件。写入(窗口+“
”); var f=新函数(“返回此函数”); 写(f()+“
”); var win=(函数(){returnthis;})(); 文件。写入(win+“
”); var e=评估(“本”); 文件。写(e+“
”); 文件。写(此+“
”); 文件。写入(窗口+“
”); document.write(document+“
”); 这是a=1; document.write(JSON.stringify(this)); }; 变量模块a_Fx='!'+ moduleA.toString().replace(/\b此\b/g,“安全此(此)”)+ "(外汇,假窗口,假文件,外汇)";; 文件。写入(模块a_Fx+“

”; 评估(模块a_Fx); ​
您只能重新分配可写属性,因此
文档和
窗口不在表中。

全局属性是不可写和不可配置的,因此不可以

// try this in global code
Object.getOwnPropertyDescriptor( this, 'document' ).writable // false

您可以执行以下操作,但必须在函数范围内评估外部脚本:

function a(window, document){
  /// in here window and document should be numerics
  alert(window);
  alert(document);
}

a(123,456);
或者,如果你有一个服务器端代理,你可以用一个包装好的anon函数重写他们的代码,然后调用你的代理文档和窗口对象

;(function(window, document){

  /// the unknown external code here.

})(windowProxy, documentProxy);
但是,仍然有办法解决这个问题,因为根据JS环境的不同,他们可能会使用以下方法:

var win = (function(){return this;})();
您可能还必须包括其他集合,以确保它们不可访问:

;(function(window, document, all, images, ...){ ... }
但是,他们也可以通过您允许他们访问的任何dom元素访问原始
文档

关于UPD6 为防有用,您可能还需要塞住以下孔:

  • 设置超时
  • 设定间隔
以上两种方法都可用于评估代码

setTimeout('(function(){alert('+'th'+'is'+');})()');
另外,当您公开
文档时,编写
这也是可行的:

document.write(
  '<img src="data:image/gif;base64,ERROR" '+
     'onerror="alert(th'+'is.ownerDocument);" />'
);

除此之外,它看起来很安全。我相信如果你足够努力的话,会有其他的解决方法,但这取决于你认为可能的攻击者的决心;)

您不能替换“文档”或“窗口”,因为这会破坏javascript的其余部分。你可以试着重写invidual方法。好吧,我不介意破坏JavaScript的“其余部分”。我很清楚我在做什么。所以我在问有没有办法取代它们?(我知道我最好不要这样做)@Ai_boy如果你的动机是能够安全地将第三方脚本嵌入到你的页面中,请检查。我认为它不允许你这样做。我刚刚尝试将
window.document
设置为5,但它没有操作,也没有更改document对象的值。至少在Chrome上。@ŠimeVidas我知道JavaScript中不存在100%的安全性,我不想阻止黑客“入侵”,我知道这是不可能的,我想阻止为我的“自制”框架编写“插件”的开发人员做愚蠢的事。@ŠimeVidas我不知道。什么是
window
的属性?它是全局对象的属性,就像
document
一样。因此,全局对象包含一个引用全局对象的
“window”
属性。@ŠimeVidas啊,我明白了,这是有道理的。好主意。。如果没有人给我更好的答案,我想我会坚持这个解决方案(你的解决方案有一个问题)@Ai_boy是的,这就是我对
var-win=(function(){return this;})的观点虽然您可能错过了我在中编辑的内容;)关于
元素.document
元素.ownerDocument
也有一个漏洞。但是,如果您制作了适当的
getElementBy
代理,您可以从理论上为它们提供元素代理。。。但这可能太过分了:)好吧,不管怎样,你有一个很好的解决方案(至少对我来说),我只是等一会儿,看看有没有人给我一个更好的建议。@Ai_boy当然,不用担心——我很想看看是否还有其他事情发生:)卡哈看起来很有趣——西姆·维达斯提到过——虽然有点牵扯。@Ai_boy nice:)我只想补充几点,我已经更新了我的答案。
document.write(
  '<img src="data:image/gif;base64,ERROR" '+
     'onerror="alert(th'+'is.ownerDocument);" />'
);
SafeThis = function(that){return that;}