同源策略 - JavaScript调用PHP

时间:2010-10-27 16:52:33

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

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

我正在尝试为我们的“客户”创建一种简单的方法,在他们的网站上放置Google地图,在地图上绘制客户(或其子集)的位置。客户在MySQL数据库中,通过PHP脚本(根据Google的示例)即时转换为XML。这在我的网站上工作正常,但是当我在另一个网站上尝试时,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(“Access-Control-Allow-Origin:*”); 到输出XML的PHP​​的顶部,但我说的并不是真的很多!

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

  6. 很抱歉,很多问题,但任何指导都将不胜感激。

    非常感谢,

3 个答案:

答案 0 :(得分:6)

解决这个问题的一个简单方法是让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支持它。

答案 1 :(得分:1)

您可以使用JSON而不是XML吗?如果是这样,你的选择3)可能是你最好的选择。这种方法存在安全风险,它只应用于已知和可靠的来源。

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

答案 2 :(得分:0)

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

相关问题