【问题标题】:Same origin policy -- JavaScript calling PHP同源策略——JavaScript 调用 PHP
【发布时间】:2011-05-01 10:36:07
【问题描述】:

我知道这是一个热门话题,但我还没有找到完全全面的答案。

我正在尝试为我们的“客户”创建一种在他们的网站上放置 Google 地图的简单方法,该方法会在地图上标出我们客户(或其子集)的位置。客户位于 MySQL 数据库中,该数据库由 PHP 脚本动态转换为 XML(根据 Google 的示例)。这在我的网站上运行良好,但是当我在另一个网站上尝试时,不允许 xmlHTTPRequest 查看 PHP,因为它在另一个域上。

我可以通过在另一个域上编写另一个 PHP 文件来规避这个问题,该文件只是读取原始域上的 PHP 文件。但并非我们所有的客户都会在他们的服务器上运行 PHP。有什么方法可以使用 JavaScript 从我们的数据库返回 XML 结果?

几点:

  1. 生成 xmlHTTPRequest 的 JavaScript 仍然位于 我们的 服务器上——我们的客户端通过脚本标签链接到它。我认为这可能就足够了,但“起源”(无论如何,根据 Chrome)仍然被视为域#2

  2. 这很好:如果我在 xmlHTTPRequest 中使用绝对引用(例如 request.open('GET', 'http://mydomain.com/api/foo.php', true)),那么它在 IE 中会失败,但如果我使用相对引用 ('/api/foo.php') 它将起作用。

  3. 我对此知之甚少,但我可以使用 JSON 吗?我见过: 'script src="http://..../someData.js?callback=some_func"' 但不知道怎么做,我会让“someData.js”看起来像 JSON? (我在函数方面想的很多,这可能是不正确的?)。

  4. 我尝试添加: header("访问控制允许来源:*"); 到输出 XML 的 PHP 的顶部,但我可以说它并没有做太多事情!

  5. 如果我在客户端服务器上使用 PHP 包装器,使用 cURL 请求而不是简单的 file_get_contents 或 fopen 有什么好处?

抱歉,有很多问题,但我们将不胜感激。

非常感谢,

垫子

【问题讨论】:

  • #3 被称为 JSONP,这听起来像你需要的。

标签: php javascript xmlhttprequest jsonp same-origin-policy


【解决方案1】:

解决此问题的一种简单方法是让您的 PHP 脚本返回如下内容:

callback_function(YOUR_DATA);

然后在客户端站点上包含的 JS 脚本中动态插入一个 <script>,其中 src 指向您的 PHP 脚本:

(function() {
    var scriptElement   = document.createElement('script');
    scriptElement.type  = 'text/javascript';
    scriptElement.async = true;
    scriptElement.src   = 'http://example.org/yourScript.php?data=...';
    var container       = document.getElementsByTagName('script')[0];
    container.parentNode.insertBefore(scriptElement, container);
})();

这种技术称为JSONP,应该完全按照您的意愿行事;)

解决此问题的另一种方法是在内容安全策略中允许跨域 XMLHttpRequest。但我认为目前只有 Firefox 4 支持。

【讨论】:

  • 是的,就是这样做的。从您的域嵌入脚本,如果需要,将变量作为参数传递给 php。
  • 这看起来很棒。我认为这需要我一点时间才能准确地弄清楚,但我 [认为我!] 大致明白了这个想法。谢谢尼克。
  • 好的,由于脚本是异步加载的,所以当我尝试访问 json 数据时会抛出错误。它什么时候可用/我如何等到它可用后再尝试访问它?另外,如果我这样做是因为'callback_fn({mydata})'我被告知'callback_fn'没有定义。
  • 必须先定义回调函数,然后动态加载脚本;)
  • 太阳照在大理石头上。是的,现在开始掌握它!只用了一天...这很有帮助:ibm.com/developerworks/web/library/wa-aj-jsonp1/index.html。 PS:谢谢;又来了!
【解决方案2】:

你能用 JSON 代替 XML 吗?如果是这样,您的选择 3) 可能是您最好的选择。这种方法存在安全风险,并且只能用于已知和受信任的来源。

更多阅读:http://www.codeproject.com/KB/aspnet/JSONToJSONP.aspx

【讨论】:

    【解决方案3】:

    JavaScript 是客户端,但数据库不是。 JavaScript 不能直接从 MySQL 数据库中提取。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2012-06-05
      • 2010-09-25
      • 2016-05-02
      • 2013-06-19
      • 2011-11-08
      • 2012-08-13
      • 2012-10-30
      • 2011-12-26
      相关资源
      最近更新 更多