2008-11-25 257 views
10

這裏的問題:跨域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上?

+1

關於跨域ajax請求真的有一篇不錯的文章 - http://tek-insight.blogspot.com/2010/05/cross-domain-ajax-request-proxy-json.html – 2011-08-26 11:27:59

回答

14

這是XSS,它被禁止。你真的不應該那樣做。

如果你真的需要,讓你的AJAX代碼調用blah.com上的本地代碼(PHP,ASP,無論什麼),並使其表現得像客戶端,並從foo.com獲取任何你需要的東西,然後返回到客戶。如果你使用PHP,你可以用fopen('www.foo.com/blah.html','r')來完成,然後像閱讀普通文件一樣閱讀內容。

當然,您的php.ini中需要啓用allow_remote_url_fopen(或任何它被稱爲準確)。

2

一個選項是實現一個代理頁面,它將所需的url作爲參數。例如http://blah.com/proxy?uri=http://foo.com/actualRequest

+2

你最好做對其進行一些驗證以確保URL是您期望的URL,否則它是一個主要的安全漏洞。 – rmeador 2008-11-25 23:00:33

+1

當然。當我說「實施」時,我認爲這是暗示的。 – Rohit 2008-11-26 13:54:21

0

上面顯示的方法可能會成爲一個很大的安全漏洞。 建議您根據白名單驗證站點名稱,並在服務器端構建實際被代理的URI。

6

有一個w3c proposal允許網站指定允許跨站點查詢給他們的其他網站。 (維基百科可能希望允許所有的文章請求,比方說,但谷歌郵件不希望允許請求 - 因爲這可能會允許任何網站打開時,當你登錄到谷歌郵件來閱讀你的郵件)。

這可能在未來的某個時間點可用。

3

如以上提到的JSONP是辦法解決。但是,您要從中請求數據的站點需要支持JSONP才能在客戶端上使用。 (JSONP實際上向頁面注入腳本標籤,並提供應該與結果一起調用的回調函數)

如果您發出請求的站點不支持JSONP,則必須在您的代理請求上服務器。如上所述,您可以在您自己的服務器上執行此操作,或者我以前完成的操作是使用http://www.jsonpit.com,它將代理您的請求。