我很好奇是否有可能覆盖window.location.hostname? 我在google上没有发现任何关于它的内容......可能我搜索了错误的短语,因为我觉得有人不得不在我面前问过它。
抱歉我的英语不好。
编辑: 更具体。我不想那样做。我想知道是否有人可以覆盖它来执行我的代码。
一般情况下 - 我有我批准执行某些代码的域名列表。当
if (window.location.hostname === myurl.com)
给出了真实,然后他们就好了,其他情况下他们会有警觉或其他什么。我不希望有人这样做:
window.location.hostname = "myurl.com"
if (window.location.hostname === myurl.com)
答案 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代码。即使他们无法覆盖特定属性,他们也可以在控制台中执行代码块。