【问题标题】:Same origin issue (file upload)同源问题(文件上传)
【发布时间】:2011-08-12 23:43:02
【问题描述】:

客户端在foo.com域上,需要上传(发送POST XMLHttpRequest)到upload.foo.com

由于同源政策,这是受到限制的。
但是,我设法想出的解决方法是,在 foo.com 打开 upload.foo.com 上动态创建 iframe 并附加执行来自 upload.foo.com 的 POST 请求的 JavaScript 代码,如下所示: iframe.onLoad [..]

(a=(b=doc)
.createElement('script'))
.src='http://foo.com/upload.php?'+Math.random(),
b.body.appendChild(a);
void(0);

现在,对我来说这似乎是多余的:如果后者是可能的,我的逻辑告诉我前者也应该是可能的。是吗?

--更新

我刚刚注意到子域上有一个包含以下内容的文件:

<?xml version="1.0" ?> 
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-access-from domain="*.foo.com" secure="false" /> 
</cross-domain-policy>

我能以某种方式利用它来发挥我的优势吗?

【问题讨论】:

  • 你运行了吗?因为我认为您也不能操纵其他域的 iframe。
  • iframe 概念有效,是的。我已经用了几天了。
  • 这样可以吗。在 foo.com 上加载 iframe src bar.foo.com;附加一个回调,该回调将调用父页面中的函数(我确实有权修改 iframe 的内容)并从该回调函数使 XMLHttpRequest 好像来自该 iframe?

标签: javascript xmlhttprequest same-origin-policy


【解决方案1】:

XMLHttpRequest 对 document.domain 不敏感,因为出于安全原因,对象需要相互选择加入,而 XHR 无法知道目标可能希望将 document.domain 值设置为什么。为了使 SiteA 与 SiteB 上的站点的 DOM 交互,两个站点必须共享一个公共的私有域后缀,并且都必须通过将 document.domain 设置为它们的公共后缀来选择进行通信。

您的跨域策略文件实际上并没有多大意义(因为它选择了所有内容,然后是所有内容的子集),但它用于 Flash,而不是 XHR(使用 CORS)。

【讨论】:

    【解决方案2】:

    我认为这不可能简化,但如果你觉得它不雅,有更简单的方法来使用跨域 JS。

    确实,如果您尝试使用 jsonp 发送请求,这几乎正是 jQuery 所做的。 Wikipedia for JSONP
    (以及其他几种绕过同源限制的方法)

    我不知道这是否是您要问的问题,但以可维护性的名义,我建议您使用jQuery approach

    您需要设置 dataType: 'jsonp' 并且一切就绪。 您可以选择设置参数“callback=?”(查看文档)。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多