【问题标题】:Safari & Javascript - Same Origin policy?Safari 和 Javascript - 同源策略?
【发布时间】:2010-09-25 05:04:39
【问题描述】:

我有一个 Javascript 可以更改链接中的主机以匹配当前的开发/测试服务器。

这是一个例子:

var ndomain = document.domain;
var mydomain = 'www.foo.com';
var alink = document.getElementsByTagName('a');
for (var i = 0; i < alink.length; i++) {
    if (alink[i].href.length > 0){
        if (alink[i].host.substr(0, mydomain.length) == mydomain){
            alink[i].host = ndomain;
        }
    }
}

这会将 http://www.foo.com/page.html 的引用更改为 http://level1.test.foo.com/page.html

这适用于我测试过的所有浏览器,除了 Safari(Mac 或 Win)。我已经搜索并搜索了有关原因的信息以及我想出的最接近的原因是“同源政策”。

根据我对同源策略的理解,这应该可行,因为一切都在 foo.com 域下。 Safari 会不会更严格,因为我要去一个二级子域(例如level1.test)?

有人可以告诉我为什么这个过程在 Safari 中不起作用,或者我怎样才能让它在 Safari 中起作用?

TIA!

【问题讨论】:

    标签: javascript security safari


    【解决方案1】:

    这应该与同源策略无关。

    在谷歌浏览器中也可以看到相同的内容。两者都使用 WebKit,所以也许 WebKit DOM 接口是问题的关键。

    在 Chrome 中运行问题中的 JS 不会更改链接中的主机。 JS 调试器和 JS 控制台都不会报告任何问题。

    尝试更改 anchor.host 属性的原因:

    • 没有错误报告
    • anchor.host 属性没有变化

    这表明 anchor.host 属性由于某种原因是只读的。

    anchor.href 属性看起来是可写的,所以这可能是你最好的选择。以下代码工作:

    var ndomain = document.domain;
    var mydomain = 'www.foo.com';
    var alink = document.getElementsByTagName('a');
    for (var i = 0; i < alink.length; i++) {
        if (alink[i].href.length > 0){
            if (alink[i].host.substr(0, mydomain.length) == mydomain){
                var currentHref = alink[i].getAttribute('href');
                var newHref = '';
    
                // Generate newHref based on currentHref and setting host as required
    
                alink[i].setAttribute('href', newHref);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      第 5 行出现语法错误(3 个左括号,只有 2 个右括号)。

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2013-06-19
        • 2011-06-01
        • 2012-08-22
        • 2012-06-05
        • 2016-05-02
        • 2014-02-03
        • 1970-01-01
        • 2011-05-01
        相关资源
        最近更新 更多