是否可以在Javascript中重写window.location.hostname?

是否可以在Javascript中重写window.location.hostname?,javascript,Javascript,我很好奇有没有可能覆盖window.location.hostname? 我在谷歌上找不到任何关于这个的信息。。。也许我搜索了错误的短语,因为我认为有人必须在我之前问它 对不起,我的英语不好 编辑: 更具体地说。我不想那样做。我想知道是否有人可以重写它来执行我的代码 一般来说,我有一个域列表,我批准它执行一些代码。什么时候 如果(window.location.hostname===myurl.com)给出true,则它们可以继续,否则它们将发出警报或其他信息。我不希望有人做那样的事: wind

我很好奇有没有可能覆盖window.location.hostname? 我在谷歌上找不到任何关于这个的信息。。。也许我搜索了错误的短语,因为我认为有人必须在我之前问它

对不起,我的英语不好

编辑: 更具体地说。我不想那样做。我想知道是否有人可以重写它来执行我的代码

一般来说,我有一个域列表,我批准它执行一些代码。什么时候

如果(window.location.hostname===myurl.com)
给出true,则它们可以继续,否则它们将发出警报或其他信息。我不希望有人做那样的事:

window.location.hostname = "myurl.com" 

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

只需将其存储到变量中并重写该变量。

window.location.*
是从window.location的值派生的,并且是只读的


您可以更改window.location,但这将触发重定向。它是一个属性,而不是一个方法。我可以从Firefox控制台更改其值,并且它尝试从其他主机加载页面()

是的,原型可以被覆盖。事实是,对于您的用例,您不能阻止用户执行Javascript代码。即使不能重写特定属性,也可以在控制台中执行代码块

与其他人告诉你的相反,这很简单:

window.__defineGetter__("location", function(){
    return {
        hostname: 'malicious site'
    };
});

alert(window.location.hostname); // will alert 'malicious site'
作为一条经验法则:您在JavaScript中进行的每一次验证都可以绕过


编辑

由于安全原因,上面的浏览器将失败,但并非所有浏览器都认为安全性是一个重要方面。 在旧IE中执行以下代码(我是在IE10兼容模式下执行的,我不确定它会模仿哪个IE):

它将导致
恶意站点

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


EDIT2

您对另一个答案发表了评论:

我想确定,如果有人在网站上粘贴我的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 
}


如果站点是他的,那么他可以完全控制执行的javascript。

根据此参考:

这些都是属性。因此,您可以“将它们设置为导航到另一个URL”-但是,这将导致重定向。

您想做什么,请具体说明或给出一个示例。通常,我会检查我的JS中执行的域代码。如果域在已批准的域列表中,那么我让它们执行代码。这就是为什么我想知道是否有人可以将其覆盖到我列表中的某个内容以执行代码。您是否尝试设置它发生了什么?它没有更改,所以这很好,但我想100%确定。您正在覆盖
window.hostname.location
而不是
window.location.hostname
。取消删除作为其他场景出现。谢谢因为我想从事这项工作。幸运的是,我不必担心这一点(我想),因为我给客户提供了类似于google analytics的代码——用户粘贴代码,它将url插入到我服务器上的JS文件中。在这种情况下,JS是
if
,它检查域,使它们无法通过
true
,因为它们没有访问该文件的权限。在我插入的JS文件变为真之前,它们只能覆盖window.location.hostname。但正如答案所示,这是不可能的。如果我想窃取你的代码,我会下载它,编辑它,然后从我的服务器上提供编辑过的代码。你对此无能为力。IE9怪癖模式将以
恶意站点
响应。IE9标准模式不会。我想这对我来说没关系。单端用户可以在控制台中尝试。重要的事实是,若有人在站点上粘贴它,那个么它将不会执行。它将执行。你不能信任运行客户端的代码。谢谢,我接受了这个答案,因为它有一个指向引用的url。谢谢。我接受了另一个问题,因为它有指向引用的url。这是不正确的,按照标记的答案所解释的更改这些内容是可能的。我编辑了我的问题以使其更具体。我不想这么做,我想确定有人不能这么做,然后不要把它变成一个全局变量。创建一个带有私有变量的自调用函数。也可以在需要时调用变量值。在控制台中这样做是可以的。我想确定,如果有人在网站上粘贴我的JS代码,那么如果他不在“列表”中,代码就不会执行。
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 
}