与其他人告诉您的相反,这很简单:
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。