2011-11-10 43 views
23

我在多個子域(example.com,blog.example.com和app.example.com)之間擁有通用的身份驗證表單。登錄表單必須不論其中顯示這些數據提交給example.com,所以我想利用CORS,但這:跨憑證憑證與資源共享

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com") 

does not work

所以我想在做下一件事的,並手動檢查Origin標在服務器端,並允許Access-Control-Allow-Origin: *,這樣的請求可能作出的,但不幸的是,這種作物了in the MDN

重要提示:在響應資格的請求時,服務器必須指定域, nd不能使用百搭梳理。

有什麼辦法讓我的請求可以跨多個域使用,而且仍然使用CORS發送憑證?

+0

我相信你也可以把域名之間用逗號。 (即,是的,你可以讓它在多個域中工作。) – BrainSlugs83

+1

我不這麼認爲。從規格: >在實踐中,原產地名單或空產量更受限制。它不是允許以空格分隔的原始列表,而是單個原點或字符串「null」。 [來源](https://www.w3.org/TR/cors/#access-control-allow-origin-response-header) – Nemo

回答

34

兩個想法:

1)你是不是也包括「訪問控制允許的憑據:真正的」頭?這是傳遞cookie憑證所必需的(並且相應的XHR客戶端必須設置.withCredentials = true)

2)您是否嘗試了來自鏈接的建議並僅包含當前請求的來源。例如,如果請求的標題爲「Origin:http://blog.example.com」,那麼您將使用「Access-Control-Allow-Origin:http://blog.example.com」進行響應,而不是原始列表。這需要在您的服務器端實現上做更多的工作。其他

3)一個想法,你提到你具有必須通過各種域共享一個單一登錄表單。那麼,如果它是一個標準的HTML表單,你可以在域之間進行常規的表單發佈。你不需要使用CORS。只需將表單的「action」屬性設置爲您想要發佈到的網址即可。例如:

<form name="login" action="http://login.example.com/doLogin"> 
+0

我結束了使用(2)。不知何故,我忽略了單一的原點方法。 – Nemo

1
// cross domain 
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']); 
header('Access-Control-Allow-Credentials: true'); 
+6

不要這樣做,如果沒有嚴格驗證Origin頭文件,或者您會打開安全漏洞 – Tom

+3

這個答案說明了爲什麼不可能擁有防僞安全 - 甚至是技術上的! >。< – BrainSlugs83

+0

確定看起來這是「本質上」與「*」相同,可以打開微妙的安全漏洞,因此不鼓勵,請參閱http://stackoverflow.com/questions/12001269/what-are-the-安全風險設置訪問控制允許來源 – rogerdpack