是否可以在Javascript中覆盖window.location.hostname?

时间:2013-05-09 12:44:15

标签: javascript

我很好奇是否有可能覆盖window.location.hostname? 我在google上没有发现任何关于它的内容......可能我搜索了错误的短语,因为我觉得有人不得不在我面前问过它。

抱歉我的英语不好。

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

一般情况下 - 我有我批准执行某些代码的域名列表。当

if (window.location.hostname === myurl.com)给出了真实,然后他们就好了,其他情况下他们会有警觉或其他什么。我不希望有人这样做:

window.location.hostname = "myurl.com" 

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

6 个答案:

答案 0 :(得分:5)

根据这个参考: https://developer.mozilla.org/en-US/docs/DOM/window.location这些是属性。因此,您可以“将它们设置为导航到另一个URL” - 但是,这会导致重定向。

答案 1 :(得分:2)

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

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);

这将导致malicious site

我不确定您可以在给定的上下文中覆盖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 
}

复制它的用户可以将其修改为:

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。

答案 2 :(得分:1)

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

您可以更改window.location但会触发重定向

答案 3 :(得分:1)

这是一种财产,而不是一种方法。我可以从Firefox控制台更改其值,并尝试从其他主机加载页面(http://fake.host/questions/16462082/...

答案 4 :(得分:0)

只需将其存储到变量中并覆盖变量。

答案 5 :(得分:0)

是的,原型可以被覆盖。实际情况是,对于您的用例,您无法阻止用户执行Javascript代码。即使他们无法覆盖特定属性,他们也可以在控制台中执行代码块。