在Javascript中有没有办法覆盖window.location.hostname?

8
我很好奇是否有可能覆盖window.location.hostname? 我在谷歌上没找到相关信息...可能是因为我用的搜索短语不正确,因为我认为肯定有人在我之前问过这个问题。
对我的英文表达不好感到抱歉。
编辑: 更具体地说,我不想这样做。我想知道是否有人可以覆盖它以执行我的代码。
一般来说-我有一个域名列表,我批准它们执行一些代码。当 如果(window.location.hostname === myurl.com)为真,则它们就可以运行,否则它们将收到提醒或其他提示。我不希望有人这样做:
window.location.hostname = "myurl.com" 

if (window.location.hostname === myurl.com)

1
你想要做什么,请具体说明或举个例子。 - Mayur Borad
通常情况下,我会在我的JS中检查代码执行的域。如果该域名在批准的域名列表中,则允许它们执行代码。这就是为什么我想知道是否有人可以将其覆盖为列表中的某些内容以执行代码。 - Rob
1
你试过设置它了吗?发生了什么事情? - epascarello
它没有改变,这很好,但我想要100%的确定。 - Rob
@SoonDead,你的链接让我跳转到了我在这里发布的问题。之前我确信这是不可能的,但我看到有人开始尝试这个,所以我想要得到具体的答案。 - Rob
显示剩余2条评论
6个回答

9

谢谢,我接受了那个答案,因为它有参考链接。 - Rob

3
与他人告诉您的相反,这很简单:
window.__defineGetter__("location", function(){
    return {
        hostname: 'malicious site'
    };
});

alert(window.location.hostname); // will alert 'malicious site'

作为一个准则:你在JavaScript中进行的每一项验证都可以被规避。
编辑
以上内容将在较好的浏览器中失败,因为安全原因,但不是所有浏览器都认为安全是一个重要方面。
在旧版IE中执行以下代码(我使用了IE10兼容模式,我不确定它模仿哪个IE):
var window = {
    location: {
        hostname: 'malicious site'
    }
};

alert(window.location.hostname);

这将导致 恶意网站

我不确定在多少其他浏览器中您可以在给定上下文中覆盖window,但这肯定令人担忧。


编辑2:

您对另一个答案的评论:

我想确保如果有人在站点上粘贴我的JS代码,则在不在“列表”上时不执行该代码。

你理解错了。没有任何东西能阻止粘贴您的代码的用户修改“列表”!或JavaScript中的任何其他内容!

例如,您的原始代码是:

function isInList(hostname) {
    for (var i = 0; i < siteList.length; i++) {
      if (siteList[i] === hostname) {
        return true;
      }
    }
    return false;
}

if (isInList(window.location.hostname)) {
    // execute code
} else {
    // do not execute 
}

用户复制它后可以进行修改:
function isInList(hostname) {
    return true;
}

if (isInList(window.location.hostname)) {
    // execute code
} else {
    // do not execute 
}

或者

if (true) {
    // execute code
} else {
    // do not execute 
}

如果这个网站是他的,他就可以完全控制执行的JavaScript代码。

你正在覆盖 window.hostname.location 而不是 window.location.hostname - dersvenhesse
另外一个情况出现了——恢复已删除的文件。 - vinczemarton
感谢您参与此次活动。我很高兴不必担心这个问题(我想),因为我向客户提供的代码类似于Google Analytics - 用户粘贴代码,该代码将URL插入到我的服务器上的JS文件中。在那个JS文件中,有一个if语句检查域名,因此它们无法通过,因为它们无法访问该文件。他们只能在我插入的JS文件之前覆盖window.location.hostname以获取true。但是,正如答案所示,这是不可能的。 - Rob
如果我想盗取你的代码,我只需要下载它,进行编辑并从我的服务器上提供修改后的版本。你无能为力。 - vinczemarton
IE9在怪异模式下会响应“恶意网站”,而在标准模式下则不会。 - cmbuckley
这个不再起作用了。 - Sted

1

在控制台中这样做是可以的。我想确保如果有人将我的JS代码粘贴到网站上,那么只有当他在“列表”上时,代码才会执行。 - Rob

0

将其存储到变量中并覆盖该变量即可。


我编辑了我的问题,使其更具体。我不想这样做,我想确保没有人可以这样做。 - Rob
那就不要把它设为全局变量。创建一个带有私有变量的自执行函数。需要时调用变量值即可。 - klewis

0

window.location.* 是从 window.location 的值派生出来的,是只读的。

你可以改变 window.location,但那会触发重定向。


谢谢。我接受了其他问题,因为它有参考链接。 - Rob
那不是真的,按照标记答案所述更改这些是可能的。 - Mike

0

是的,原型可以被覆盖。事实上,在您的用例中,您不能防止用户执行Javascript代码。即使他们无法覆盖特定属性,他们仍然可以在控制台中执行代码块。


这对我来说没问题。单个终端用户可以在控制台中尝试。重要的事实是,如果有人将其粘贴到网站上,则不会执行。 - Rob
它将会执行。你不能信任在客户端运行的代码。 - andy magoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接