【问题标题】:HTTPS to HTTP JSONP requestHTTPS 到 HTTP JSONP 请求
【发布时间】:2012-03-25 04:13:26
【问题描述】:

我在发送 JSONP 请求从 HTTPS 站点到 HTTP 站点时遇到问题。

我有一个通过 https 的(非本地)测试环境(具有有效证书),我能够成功运行所有这些跨站点/“跨协议”请求(带有警告,但没有错误)。

Google Chrome Javascript 控制台输出

The page at https://my.test.environment/ ran insecure content from http://non.secure.site/service?jsonCallback=jsonp1331132928704

但是,在生产中,(在 Google App Engine 上,appspot 子域)Google Chrome 会阻止所有等待用户确认的请求。

Google Chrome Javascript 控制台输出(特别注意 [blocked] 文本):

[blocked] The page at https://production.appspot.com/ ran insecure content from http://non.secure.site/service?jsonCallback=jsonp1331132928704

我知道我正在做的事情并不安全,但这项服务是由第三方提供的,目前还没有可用的 SSL 通信。我对此感到非常困惑,因为我不明白为什么在测试环境中而不是在 apppot(Google App Engine)下工作(带有警告)。

我试图调查标题但没有成功。

测试环境头文件:

Connection:Keep-Alive
Content-Encoding:gzip
Content-Language:es
Content-Length:2524
Content-Type:text/html;charset=utf-8
Date:Wed, 07 Mar 2012 15:48:30 GMT
Keep-Alive:timeout=15, max=100
Set-Cookie: cookie_info...
Vary:Accept-Encoding

APPSpot 标头:

access-control-allow-credentials:false
access-control-allow-origin:*
cache-control:no-cache, must-revalidate
content-encoding:gzip
content-length:47890
content-type:text/html; charset=utf-8
date:Wed, 07 Mar 2012 14:52:02 GMT
expires:Fri, 01 Jan 1990 00:00:00 GMT
pragma:no-cache
server:Google Frontend
set-cookie: coookie_info....
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1

我不知道为什么这在测试环境中起作用,并且谷歌浏览器在 APPSpot 上阻止了相同的方法。

有什么想法吗?

【问题讨论】:

  • Chrome 对 Google HTTPS 页面的处理通常与标准 HTTPS 页面不同(例如特殊证书检查)。不安全的内容可能也是这种情况吗?
  • 也许你是对的。实际上,只有在我们将应用部署在 GAE 上时才会出现问题(appspot 使用 Google 的证书)。我会深入研究它。谢谢!
  • 我自己的服务器和(有效的)证书也有同样的问题...
  • 好吧,在这里回答:stackoverflow.com/questions/12216208/…
  • 我必须指出一件重要的事情——您刚刚写到您正在对第三方进行 JSONP 调用,而他们不提供安全性。伙计... JSONP 只是从第三方运行 javascript 并希望它使用一些数据调用您的函数的名称。如果该调用中没有 https,任何人都可以执行 MITM 并运行一些代码来拦截您尝试使用 https 保护的任何数据。

标签: javascript ajax https cross-domain jsonp


【解决方案1】:

Apache 代理将代表您向端点发出请求。您甚至可以对服务(json、xml、图像、post、put、delete 等)发出非 jsonp 请求,因为浏览器认为它正在向同一个域发出请求。

您的 non.secure.site vhost 文件将包含类似

ProxyRequests Off
ProxyPreserveHost On 
<Proxy *>
    Allow from all
</Proxy>
ProxyPass /appspot https://production.appspot.com/
ProxyPassReverse /appspot https://production.appspot.com/

设置完成后,您只需调用服务...

http://non.secure.site/appspot/service?jsonCallback=jsonp1331132928704

Google proxypass 了解更多信息

https://serverfault.com/questions/429404/help-me-understand-how-to-use-proxypass

【讨论】:

    【解决方案2】:

    如果您没有其他选择,只能使用不受保护的 3rd-party API,您可以自己考虑 MITM 该 API。

    创建一个只能通过 SSL 访问的服务器端脚本,它将充当您的代码和 API 之间的代理或转发器。这样,您可以通过对数据进行自己的检查和验证来提高安全性,并且由于您将在 SSL 下提供数据,因此您不会收到任何“混合内容”错误。

    顺便说一句,我还没有测试过,根据 GAE 提供的 Google 证书下的网站总是有可能会有不同的行为。

    希望我能帮上忙。

    【讨论】:

      【解决方案3】:

      我在 http 和 https 之间做同样的事情时遇到了同样的问题。这是一个跨域问题。

      您需要的最重要的事情是您用于进行 curl 的服务器端页面必须设置一些标头以允许 http 到 https 连接。这是下面....

      header("Access-Control-Allow-Origin: your https url");
      header("Access-Control-Allow-Methods: POST, GET");
      header("Access-Control-Max-Age: 1728000");
      
      header("Access-Control-Allow-Headers: Content-Type, Connection, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");
      header("Connection: close");
      

      【讨论】:

        猜你喜欢
        • 2013-11-02
        • 1970-01-01
        • 2012-08-26
        相关资源
        最近更新 更多