【问题标题】:History.js and Same Origin Policy traversing to SSLHistory.js 和同源策略遍历到 SSL
【发布时间】:2012-01-23 20:39:57
【问题描述】:

我正在使用 history.js 并尝试从 HTTP 站点推送状态更改,例如:

http://www.example.com/some/resource

...到我的安全网站(支付页面),例如:

https://www.example.com/payment/for/some/resource

...但我在 Safari 中遇到此错误:

SECURITY_ERR: DOM Exception 18: 试图突破 用户代理的安全策略。

...当试图推动状态变化时:

History.pushState(null, null, new_state_url);
// new_state_url = https://www.example.com/payment/for/some/resource

进行了一些挖掘,我发现了this SO question,这表明我正在与Same Origin Policy 发生冲突,因为我正在尝试跨协议推动状态更改。那里的建议答案(如果我理解正确的话)是显式推送完整的 URL,但我已经这样做了并且得到了同样的错误。

在上下文中,我正在构建我的网站的移动版本,并希望使用我围绕所有其他页面加载构建的相同 AJAX 加载支付页面(我已经使用 jQuery 构建了我的页面加载器$.ajax 和一些自定义动画,与您在 jQuery Mobile 中可能发现的大致相似)。

我是否可以跨 SSL 推送此状态更改?如果是这样,我该怎么做?

【问题讨论】:

    标签: javascript ajax mobile same-origin-policy browser-history


    【解决方案1】:

    这个答案与问题无关,但是当我经常调用window.history.replaceState 时,我在 Safari 中遇到了同样的错误。我在调用该函数的地方添加了速率限制,安全错误消失了。

    【讨论】:

      【解决方案2】:

      同源不仅包括协议和域,还包括元组协议、域和端口。

      在您的情况下,听起来您正在与协议(HTTP 与 HTTPS)和端口(80 和 443)发生冲突。

      有几种标准方法可以解决 SOP。一种方法是将两个域上的 document.domain 设置为相同的任意字符串:

      document.domain = "foo.com";
      

      另一个好方法是使用 GET 跨域加载 JSONP。

      说了这么多,听起来pushState 并不是您想要做的。 History API 允许您在同一个域上导航,而无需重新加载资源,同时仍然保留。由于这是一个完全独立的域,我只需将 document.location 属性设置为新 URL(您的安全登录页面),这将重新加载页面但仍保留您的导航历史记录。

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2010-09-25
        • 2014-06-05
        • 2013-03-01
        • 2021-04-02
        相关资源
        最近更新 更多