6

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

对不起,我的英语不好。

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

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

if (window.location.hostname === myurl.com)给出真实的那么他们很高兴,否则他们会有警觉或其他东西。我不希望有人做这样的事情:

window.location.hostname = "myurl.com" 

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

6 回答 6

7

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

于 2013-05-09T12:57:00.233 回答
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);

这将导致malicious site.

我不确定您可以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。

于 2013-05-09T12:55:29.797 回答
1

它是一个属性,而不是一个方法。我可以从 Firefox 控制台更改它的值,并尝试从不同的主机加载页面(http://fake.host/questions/16462082/...

于 2013-05-09T12:53:06.653 回答
0

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

于 2013-05-09T12:48:18.597 回答
0

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

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

于 2013-05-09T12:50:58.210 回答
0

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

于 2013-05-09T12:54:05.593 回答