2012-02-01 74 views
5

編輯:在這裏找到答案Ajax using https on an http page針對不同協議的跨域

如何繞過不同協議的相同原點策略?

我發現這一點: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

它說,HTTP和HTTPS是不一樣的領域。有可能的跨子域方法,如

document.domain =「https://company.com」;

上的來電文件?

當然,鑑於這兩個網站都在company.com。區別在於使用http和其他https。

還是我必須使用通常的跨域方法,如JSONP,代理和CORS?

回答

0

一般來說 - 是的,您需要使用JSONP執行跨域或跨協議請求才能遵守同源策略。

爲了提供一個替代使用頁眉設置訪問控制允許來源「*」 這是不是在每一個瀏覽器的支持,如有變更等

您可以使用PHP或其他服務器端編程語言通過在您的ajax url中請求同源(本地)php腳本來模仿來自不同來源或協議的同源響應。

在PHP和jQuery的情況下 - 這裏是一些通用的例子。

以下兩種方法都存在爭議,容易出錯,並且會受到跨站點腳本攻擊的影響,正如標題集Access-Control-Allow-Origin「*」!

所以一定要格式化您自己的CSRF令牌或密鑰握手,轉義任何形式的用戶輸入,或使用框架來標準化請求/響應以防止攻擊。

服務器爲了接收外部數據需要做額外的頁面請求也有相關的開銷,但比期望客戶端和服務器支持Header set Access-Control-Allow-Origin「更可靠」* 「

向服務器端腳本發送本地請求,並期望json作爲響應。

HTML

<script type="text/javascript"> 
$.ajax({ 
type: 'get', 
url: '/get_cross_domain.php', 
dataType: 'json', 
data: { 
    'foo' = 'bar' 
}, 
success: function(data){ 
    console.log(data); 
} 
}); 
</script> 

獲得從不同的域或協議的數據提供給本地請求。

響應出現在內部,而實際數據來自外部源。

get_cross_domain。PHP (捲曲)

<?php 
//initial output buffer 
ob_start(); 
$ch = curl_init(); 
$options = array(
    CURLOPT_URL => 'https://example.com/json_source.js', 
    CURLOPT_RETURNTRANSFER => true 
); 
curl_setopt_array($ch, $options); 
$response = curl_exec($ch); 
curl_close($ch); 
$json = $response; 
//send nothing but the json response 
ob_start(); 
header('Content-Type: application/json'); 
echo $json; 
ob_flush(); 
//discard anything other than our json response. 
while(ob_get_level > 0){ 
    ob_end_clean(); 
} 
exit; 

捲曲方法,使您能夠選擇更多的控制,比如可以定義引薦,而忽略無效的CA公司等

get_cross_domain.php (包括)

<?php 
//requires allow_url_include=1 in php.ini 
ob_start(); 
include('https://example.com/json_source.js'); 
$json = ob_get_clean(); 
header('Content-Type: application/json'); 
echo $json; 
exit;