来自js文件的跨域Ajax请求

时间:2008-11-25 22:05:04

标签: javascript html ajax

问题在于:

1。)我们在这里有页面... www.blah.com/mypage.html

2。)该页面请求像这样的js文件www.foo.com ......

<script type="text/javascript" src="http://www.foo.com/jsfile.js" />

3。)“jsfile.js”使用Prototype将Ajax请求发回www.foo.com。

4.。)ajax请求调用www.foo.com/blah.html。回调函数获取html响应并将其抛入div。

这似乎不起作用,我想这是XSS。这是对的吗?

如果是这样,我该如何解决这个问题?有没有其他方法可以在不使用iframe的情况下将我的html从www.foo.com上传到www.blah.com而不使用iframe?

7 个答案:

答案 0 :(得分:14)

是XSS,禁止使用。你真的不应该那样做。

如果你真的需要,让你的AJAX代码调用blah.com上的本地代码(PHP,ASP,无论如何),使其行为像客户端一样,从foo.com获取你需要的任何东西并将其返回给客户端。如果您使用PHP,则可以使用fopen('www.foo.com/blah.html','r')执行此操作,然后将内容读取为常规文件。

当然,需要在php.ini中启用allow_remote_url_fopen(或其他任何名称)。

答案 1 :(得分:6)

允许网站指定允许对其进行跨站点查询的其他网站有w3c proposal。 (例如,维基百科可能希望允许所有文章请求,但谷歌邮件不希望允许请求 - 因为这可能允许任何网站在您登录谷歌邮件时打开以阅读您的邮件。)

这可能会在将来的某个时候出现。

答案 2 :(得分:3)

如上所述,JSONP解决了这个问题。但是,您请求数据的站点需要支持JSONP才能在客户端上使用。 (JSONP本质上是在页面中注入一个脚本标记,并提供一个应该用结果调用的回调函数)

如果您提出请求的网站不支持JSONP,则必须在您的服务器上代理该请求。如上所述,您可以在自己的服务器上执行此操作,或者我过去所做的事情是使用http://www.jsonpit.com,它将为您代理请求。

答案 3 :(得分:2)

一种选择是实现一个代理页面,该页面将所需的url作为参数。例如http://blah.com/proxy?uri=http://foo.com/actualRequest

答案 4 :(得分:1)

JSONP部分旨在解决您遇到的问题

http://ajaxian.com/archives/jsonp-json-with-padding

JQuery在$ .getJSON方法中有它。

http://docs.jquery.com/Ajax/jQuery.getJSON

答案 5 :(得分:0)

上面显示的方法可能会成为一个很大的安全漏洞。 建议您根据白名单验证站点名称,并构建服务器端代理的实际URI。

答案 6 :(得分:0)

对于跨域命中,这是一个很好的工作示例,现在被视为“标准”http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html

还有其他方法,例如注入带有document.domain的iframe改为

http://fettig.net/weblog/2005/11/28/how-to-make-xmlhttprequest-connections-to-another-server-in-your-domain/

我仍然认为,简单的方法是在同一个域中调用代理,但它不是真正的客户端WS调用。