2012-08-30 47 views
1

使用由Delphi安裝的Delphi XE2 Update 4和Indy組件10.5.8.0。有沒有辦法讓Indy接受過期的cookies?

爲了安全起見,我正在努力的一個網站故意向我發送一個包含已過期日期的cookie。這是故意的,我必須和它一起生活,而與他們合作的其他開發人員也設法做到這一點。

服務器對我IdHTTP.Get()看起來是這樣的:

Recv 8/30/2012 3:06:15 PM: HTTP/1.1 200 OK<EOL> 
Date: Thu, 30 Aug 2012 19:06:35 GMT<EOL> 
Server: Apache/2.2.3 (CentOS)<EOL> 
X-Powered-By: PHP/5.1.6<EOL> 
Set-Cookie: dati=eJxLtDKxqi62MrdSykyJLy1OLVKyLrYytVIyNjcxtISyc%2FLTM%2FNAbKAqt4CgYJfUMhDPEqinOB4omZ6aAuIbWilFgmkDkGGpeSWZaZkQ8wyNrZTSchKLMwryM%2FNK4ouKlaxrAYdvJUQ%3D; 
expires=Thu, 01-Jan-1970 00:03:00 GMT<EOL> 
Content-Length: 16<EOL> 
Connection: close<EOL> 
Content-Type: text/plain;; charset=ISO-8859-1<EOL><EOL> 
0 24.141.251.145 

注意1970年到期!我一直在使用Indy三天,儘可能接近我可以告訴這個嘗試創建一個cookie被IdHttp和相關的CookieManager忽略。

假設我需要接收並使用cookie,那麼捕獲它的正確方法是什麼,或者我現在應該逃走嗎?我有很多德爾菲的經驗,但這是我第一次進入互聯網連接的美妙世界,這次到期的cookie業務讓我撓頭了!

+0

在嘗試添加它之前,能否修改Cookie EXPIRES日期? – Daisetsu

回答

5

發送過期的cookie是web服務器如何刪除客戶端上的cookie。 Indy的cookie經理支持這一點。當它收到一個cookie時,它將刪除相同名稱/域/路徑三重奏的任何現有cookie,然後如果它已經過期,將丟棄新的cookie。這是硬編碼的行爲。

如果無論出於何種原因需要保留過期的cookie(因爲沒有任何web客戶端應該這樣做,這是沒有意義的),您必須使用TIdCookieManager.OnNewCookie事件來改變cookie到期後由TIdCookie解析,但在它由TIdCookieManager處理之前。您可以將TIdCookie.Expires屬性設置爲未來日期,或者將其設置爲0.0以禁用其到期。你必須這樣做,因爲TIdCookieManager實現了對過期cookie的清理(只要TIdHTTP要求cookie發送HTTP請求時就會觸發該過濾),所以如果你不改變過期,那麼cookie就會被丟棄以後的時間。

+0

非常感謝您的速度回覆!我試圖攔截IdCookieManager1.OnNewCookie事件中的cookie,但是cookie到達時未觸發該事件。 IdHTTP1組件指向IdCookieManager1,但不知何故後者沒有被使用?內部的Cookie管理器可能正在使用嗎? –

+0

如果事件未觸發,則TIdHTTP.AllowCookies屬性爲false,cookie未被正確解析,或者cookie被拒絕爲無效(除了過期)。我會稍微研究一下。 –

+0

我可以確認AllowCookies一直設置爲true。因爲我對Indy來說是如此的新鮮,所以我可能會錯過其他明顯的東西,但現在我已經投入了大量的時間,並且我非常確定我已經覆蓋了至少基礎知識。我使用Delphi XE2 update 4發佈的版本有什麼關係嗎?我應該下載開發版本並嘗試使用它嗎?我*真的*欣賞你的幫助btw。謝謝 –

相關問題