Javascript 来自非安全页面的安全xmlhttprequest

Javascript 来自非安全页面的安全xmlhttprequest,javascript,html,ajax,Javascript,Html,Ajax,我想从非安全页面()中运行的javascript对安全uri()进行XMLHttpRequest。我尝试过各种各样的疯狂的东西,比如iFrame和动态脚本元素,到目前为止还没有成功。我知道我违反了“同一原产地政策”,但一定有办法做到这一点 除了用javascript编写SSL协议之外,我会选择任何古怪的解决方案。你不能用XHR绕过跨域起源(好吧,只有在用户许可的情况下才使用Firefox 3.5,这不是一个好的解决方案)。从技术上讲,从端口80(http)移动到443(https)违反了该策略(

我想从非安全页面()中运行的javascript对安全uri()进行XMLHttpRequest。我尝试过各种各样的疯狂的东西,比如iFrame和动态脚本元素,到目前为止还没有成功。我知道我违反了“同一原产地政策”,但一定有办法做到这一点


除了用javascript编写SSL协议之外,我会选择任何古怪的解决方案。

你不能用XHR绕过跨域起源(好吧,只有在用户许可的情况下才使用Firefox 3.5,这不是一个好的解决方案)。从技术上讲,从端口80(http)移动到443(https)违反了该策略(必须是相同的域和端口)。这是规范本身位于此处的示例-

你看过JSONP()或CSSHttpRequests()吗

JSONP是一种将
标记添加到具有跨域预定义全局回调的页面的方法(您可以将
s
src
放在web上的任何位置)。例如:

<script>

    function globalCallback (a) { /* do stuff with a */ }
在脚本执行后,您将获得所需的数据


CSSHttpRequests更像是一个黑客,所以我从来没有必要使用它,尽管如果你不喜欢JSONP,可以尝试一下:)。

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

  • 尼古拉斯·C·扎卡斯

您也可以使用as。它需要一些额外的JavaScript工作,您可能需要“填充”您的web服务响应,但这是另一个在所有当前浏览器中都可以使用的选项。

您说过,除了用JavaScript编写SSL协议,您会采取任何措施。。。但我猜你的意思是如果你必须自己写的话

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


查看自述文件末尾的博客文章,以获得关于其工作原理的更深入解释。

+1甚至考虑用JavaScript编写SSL!我认为这是不可能的。以前被问到:可能使用iFrame和书签哈希是有点可能的,但这很难看,而且只有在哈希后的部分没有发送到服务器时才安全。stale,这个问题的答案现在已经改变了Hello@amwinter:你能提供从非安全页面进行安全调用的代码(git)/片段吗,但是{big{phat object}}是在外部脚本中定义的。无法传入数据,是吗?当您调用
globalCallback
时,它会将数据传递给原始页面的函数。。。“传入数据”将其返回到原始页面。我想将数据传递到远程脚本,而不将其放入url。您没有将其放入url…您只是调用了一个全局函数。忽略此实例中标记的
src
。这就像你在一个
中声明了一个
函数,然后在同一页上的另一个
中调用了它(因为你真的是)。哦,我明白你的意思了-你想将数据发送到远程脚本(而不是从中获取数据)。如果希望它在功能上隐藏,可以将其存储在安全cookie或SSL页面的GET/POST(GET/POST是加密的,如我所说)中。我很想看到一个针对旧浏览器的解决方案,但这是干净的,而且现在可以使用。有针对旧浏览器的解决方案,使用反向代理,但您将失去SSL的好处。。。我想你不愿意牺牲这一点,因为在这种情况下,你可以从http(或两者)提供你的
/ajaxservice/
。如果你在
src
中使用https://你不会失去好处。…@Dan Beam:我想这会弹出一些浏览器警告,不是吗?说您混合了安全内容和非安全内容?@amwinter:使用easyXDM(),即使在较旧的浏览器中,您也可以轻松做到这一点,而且它比CORS更容易设置,因为它没有服务器端要求!查看这里的ajax示例,并在这里阅读更多关于它的内容
    var jsonp = document.createElement('script');
    json.setAttribute('src','http://path.to/my/script');
    document.body.appendChild(jsonp);

</script>
 globalCallback({"big":{"phat":"object"}});