2010-05-28 190 views
4

我想從一個不安全的頁面(http://site.com/page.htm)內運行的JavaScript的XMLHttpRequest到一個安全的uri(https://site.com/ajaxservice/)。我嘗試過各種各樣的堅果,比如iframe和動態腳本元素,到目前爲止還沒有結束。我知道我違反了「同一起源政策」,但必須有某種方式來完成這項工作。安全xmlhttprequest從不安全的頁面

我會採取任何一種古怪的解決方案,只是用JavaScript編寫SSL協議。

+2

+1甚至考慮在JavaScript中編寫SSL! – dkamins 2010-05-28 02:07:29

回答

4

正如您所提到的那樣,由於same origin policy的原因,默認情況下不起作用。現代瀏覽器正在實施CORS(跨源資源共享),您可以使用它來解決此問題。但是,這隻適用於Internet Explorer 8+,Firefox 3.5+,Safari 4+和Chrome,並且需要一些服務器端的工作。你可能想看看下面的文章關於這個主題延伸閱讀:

您還可以使用JSONPDan Beam suggested in another answer。它需要一些額外的JavaScript工作,並且您可能需要「填充」您的Web服務響應,但這是另一種適用於所有當前瀏覽器的選項。

+0

固體。很想看到舊版瀏覽器的解決方案,但這很乾淨,並且今天就可以使用。 – amwinter 2010-05-28 02:27:40

+0

JSONP或代理頁面(即http://path.to/me?get=https://path.to/get) – 2010-05-28 02:29:14

+0

對於使用反向代理的舊瀏覽器,有一些解決方案,但是您將失去SSL ......我想你不願意犧牲它,因爲在這種情況下,你可能只是從http(或兩者)提供'/ ajaxservice /'。 – 2010-05-28 02:29:58

0

我不認爲這是可能的。以前問: Ajax using https on an http page

+0

這可能是使用iframe和書籤哈希的可能性,但這是醜陋醜陋的醜陋,只有在散列之後的部分未發送到服務器時纔是安全的。 – amwinter 2010-05-28 02:16:31

+0

陳舊,該問題的答案現在已經改變 – 2011-11-21 21:26:37

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>小號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,可以試試看:)。

+0

ok,但在外部腳本中定義了{big {phat object}}。沒有辦法傳遞數據,是嗎? – amwinter 2010-05-28 02:23:09

+0

當你調用'globalCallback'時,它將它傳遞給原始頁面的函數...「傳遞給數據」 – 2010-05-28 02:30:35

+0

將它返回到原始頁面。我想將數據傳遞給遠程腳本而不將其放入url中。 – amwinter 2010-05-29 12:15:59

2

你說你會採取任何措施,儘量不要使用JavaScript編寫的SSL協議......但我認爲你的意思是如果你必須自己寫。

的開源Forge項目提供了一個JavaScript TLS實現,具有一定的閃光一起處理跨域請求:

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

退房在自述年底的博客文章,以獲得更深入解釋它是如何工作的。

+0

酷男!這很有用 – amwinter 2010-08-01 21:50:32