簡體   English   中英

PHP如何將原始cookie解析為$ _COOKIE?

[英]How does PHP parse raw cookies into $_COOKIE?

我有跨域AJAX請求的問題。

此問題涉及三台服務器。 我們可以稱它們為A1A2B.

A1A2運行相同的應用程序代碼。 它們是同一Web應用程序的兩個臨時實例。 B是另一個Web應用程序。

我們需要從A Web應用程序到B應用程序執行跨域AJAX請求。 我們嘗試啟用CORS但很難在IE <= 8中令人滿意地工作,所以現在我們使用的是nginx代理規則。 因此流程是:瀏覽器ajax請求 - > A1A2 - > nginx代理 - > B.

B是有狀態的,需要用戶的會話cookie才能運行。

我們看到的是,這在使用服務器A1時正常工作,但在使用服務器A2時B無法提取cookie。

我查看了來自A1A2的請求的標題,它們是相同的。 兩者都在標題中有cookie行,兩者都有相同的來源等。

B上我們看到$ _COOKIE ['session_key']在請求來自A2時為空,但在請求來自A1時正確填寫。

奇怪的是,它只是缺少從標題中的cookie中拉出一個特定的cookie密鑰,並且僅在請求來自A2時 它解析了A2中標題中的所有其他cookie,它只是因為某些原因無法解析用戶的會話cookie,但如果請求來自A1,它就可以了。

我已經使用了tcpdump並取了每個的pcaps並將它們區分開來,標題中沒有任何內容看起來特別不同。

我發現這個Stack Overflow問題並且人們說這是因為他的cookie標題字符串太長了: 什么可能導致cookie沒有設置在$ _COOKIE中,當它在$ _SERVER時我不認為太長,因為我的只有249個字符在成功和失敗的情況下都是如此。

我正在考慮從$ _SERVER中刪除cookie並手動解析它們,但這聽起來真的很愚蠢,我更願意找出潛在的問題。

使用IE <= 8時的一個問題是P3P 我發現將P3P標頭放入接受AJAX / JSON請求的頁面(實例中的服務器B)將解決此問題:

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

至於server A2不發送$_COOKIE請求到server B ,我會建議使用發送請求_GET以某種init頁面server B 這樣它就可以被處理並存儲在server B 然后,對於必須存在此信息的所有剩余頁面,您可以查看server B以確定是否已發送信息,或者將_GET數據連續發送到每個頁面並將其與現有信息進行比較。 提醒一下,應嚴格監控此信息,因為它更容易修改。

我道歉,我意識到這不能解決問題,但可以提供替代解決方案。

PHP在這里沒有錯。

我們使用的是Kohana,它在初始化時運行了一些代碼,試圖為會話cookie添加額外的安全性。 有問題的代碼驗證了服務器端會話中記錄的IP地址與請求頭中發送的IP地址相匹配。

由於我們的網絡配置,我在聯系服務器B時始終收到外部IP,在聯系A2時收到內部IP,在聯系A1時收到外部IP。

當A2將請求與內部IP轉發給B時,它觸發了Kohana的基於IP的cookie保護,因為cookie是使用我的外部IP創建的,但現在嘗試由我的內部IP使用。

前段時間,我不得不做跨域ajax請求。 顯然,當我嘗試使用IE設置標題“允許x-domain ajax”(不記得標題名稱)時,我遇到了同樣的問題。

我做了這個排序,是在服務器的ajax之間使用CURL。 因此,通過這種方式,我的ajax腳本(用PHP編寫)能夠通過JSON + CURL通過服務器交換數據,通過CURL POST發送數據,並通過CURL GET重新獲取數據,無論涉及哪些域。

請原諒,也許這不是您需要的答案,但是,IMO,這可以幫助尋找跨站點ajax的人。

在服務器之間使用GET; 就這樣。 並構建一種散列get的方法,以便在服務器無法完成請求時,用戶看不到實際的cookie內容被拉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM