【问题标题】:Cross-site XMLHttpRequest跨站 XMLHttpRequest
【发布时间】:2010-09-28 13:05:37
【问题描述】:

我想提供一段 Javascript 代码,它可以在包含它的任何网站上运行,但它总是需要在托管 Javascript 的服务器上获取更多数据(甚至修改数据)。我知道出于显而易见的原因存在安全限制。

考虑在 xyz.com 上托管的 index.html,其中包含以下内容:

<script type="text/javascript" src="http://abc.com/some.js"></script>

some.js 能否使用 XMLHttpRequest 将数据发布到 abc.com?换句话说,abc.com 是否因为我们从那里加载了 Javascript 而被隐式信任?

【问题讨论】:

    标签: javascript ajax xmlhttprequest xss


    【解决方案1】:

    对您来说最简单的选择是通过加载 javascript 的服务器代理调用。所以 some.js 会调用托管服务器,该服务器会将请求转发到 abc.com。

    当然,如果这不是一个选项,因为你不控制主机,有一些选项,但它似乎陷入了跨浏览器的困难: http://ajaxian.com/archives/how-to-make-xmlhttprequest-calls-to-another-server-in-your-domain

    【讨论】:

      【解决方案2】:

      some.js 能否使用 XMLHttpRequest 将数据发布到 abc.com?换句话说,abc.com 是否因为我们从那里加载了 Javascript 而被隐式信任?

      不,因为脚本被加载到一个单独的域中,它没有访问权限...

      如果您信任数据源,那么 JSONP 可能是更好的选择。 JSONP 涉及将新的 SCRIPT 元素动态添加到页面,并将 SRC 设置为另一个域,并将回调设置为查询字符串中的参数。例如:

      function getJSON(URL,success){
          var ud = 'json'+(Math.random()*100).toString().replace(/\./g,'');
          window[ud]= function(o){
              success&&success(o);
          };
          document.getElementsByTagName('body')[0].appendChild((function(){
              var s = document.createElement('script');
              s.type = 'text/javascript';
              s.src = URL.replace('callback=?','callback='+ud);
              return s;
          })());
      }
      
      getJSON('http://YOUR-DOMAIN.com/script.php?dataName=john&dataAge=99&callback=?',function(data){
          var success = data.flag === 'successful';
          if(success) {
              alert('The POST to abc.com WORKED SUCCESSFULLY');
          }
      });
      

      因此,您需要托管自己的脚本,该脚本可以使用 PHP/CURL 发布到 abc.com 域,然后以 JSONP 格式输出响应:

      我不太擅长 PHP,但可能是这样的:

      <?php
          /* Grab the variables */
          $postURL = $_GET['posturl'];
          $postData['name'] = $_GET['dataName'];
          $postData['age'] = $_GET['dataAge'];
      
          /* Here, POST to abc.com */
          /* MORE INFO: http://uk3.php.net/curl & http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html */
      
          /* Fake data (just for this example:) */
          $postResponse = 'blahblahblah';
          $postSuccess = TRUE;
      
          /* Once you've done that, you can output a JSONP response */
          /* Remember JSON format == 'JavaScript Object Notation' - e.g. {'foo':{'bar':'foo'}} */
          echo $_GET['callback'] . '({';
          echo "'flag':' . $postSuccess . ',";
          echo "'response':' . $postResponse . '})";
      
      ?>
      

      因此,您可以控制的服务器将充当客户端和 abc.com 之间的媒介,您将以 JSON 格式将响应发送回客户端,以便 JavaScript 可以理解和使用它...

      【讨论】:

        【解决方案3】:

        您可以使用easyXSS。它是一个库,使您能够传递数据并跨域边界调用方法。它非常简单,您应该能够使用它。 code.google.com 网站上有很多例子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-04
          • 2011-03-09
          • 1970-01-01
          • 2015-04-24
          相关资源
          最近更新 更多