从非安全页面安全xmlhttprequest

时间:2010-05-28 02:03:37

标签: javascript html ajax

我想从一个在非安全页面(https://site.com/ajaxservice/)内运行的javascript向一个安全的uri(http://site.com/page.htm)创建一个XMLHttpRequest。我已经尝试了各种各样的疯狂的东西,比如iframe和动态脚本元素,到目前为止还没有去。我知道我违反了“相同的原产地政策”,但必须有一些方法来实现这一目标。

我会采用任何一种古怪的解决方案,而不是用javascript写的SSL协议。

4 个答案:

答案 0 :(得分:5)

正如您所提到的,由于same origin policy,默认情况下无效。现代浏览器正在实现CORS(跨源资源共享),您可以使用它来解决此问题。但是,这仅适用于Internet Explorer 8 +,Firefox 3.5 +,Safari 4+和Chrome,并且需要一些服务器端工作。您可能需要查看以下文章以进一步阅读此主题:

您也可以将JSONP用作Dan Beam suggested in another answer。它需要一些额外的JavaScript工作,您可能需要“填充”您的Web服务响应,但它是另一个适用于所有当前浏览器的选项。

答案 1 :(得分:4)

你不能用XHR规避跨域起源(嗯,仅在Firefox 3.5中得到用户的许可,不是一个好的解决方案)。从技术上讲,从端口80(http)移动到443(https)正在破坏该策略(必须是相同的域和端口)。这是规范本身网站的示例 - http://www.w3.org/Security/wiki/Same_Origin_Policy#General_Principles

您是否研究过JSONP(http://en.wikipedia.org/wiki/JSON#JSONP)或CSSHttpRequests(http://nb.io/hacks/csshttprequest)?

JSONP是一种向页面添加<script>标记的方法,该网页具有跨域预定义的全局回调(因为您可以将<script> s src放到网络上的任意位置)。例如:

<script>

    function globalCallback (a) { /* do stuff with a */ }

然后您将<script>标记插入到其他域中,如下所示:

    var jsonp = document.createElement('script');
    json.setAttribute('src','http://path.to/my/script');
    document.body.appendChild(jsonp);

</script>

在外部脚本的源代码中,您必须使用要传递给它的数据调用globalCallback函数,如下所示:

 globalCallback({"big":{"phat":"object"}});

在脚本执行后,您将获得所需的数据!

CSSHttpRequests有点像黑客,所以我从来没有必要使用它,但如果你不喜欢JSONP,请随意尝试一下,:)。

答案 2 :(得分:2)

你说你会用不到用JavaScript编写的SSL协议......但我认为你的意思是你必须自己编写。

opensource Forge项目提供了一个JavaScript TLS实现,以及一些用于处理跨域请求的Flash:

http://github.com/digitalbazaar/forge/blob/master/README

查看自述文件末尾的博文,深入了解其工作原理。

答案 3 :(得分:0)

我不认为这是可能的。以前问过: Ajax using https on an http page