2008-09-23 108 views
1

我試圖存儲在cookie中的XML序列化對象,但我得到這樣的錯誤:存儲XML數據

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...") 

我知道,從similiar案件的問題,當你嘗試存儲在表單輸入字段中看起來像JavaScript代碼的東西。

這裏的最佳做法是什麼?有沒有一種方法(如我所描述的形式問題)從asp.net框架抑制此警告,或者我應該JSON序列化,或者也許我應該二進制序列化它?將序列化數據存儲在cookie中時常見的做法是什麼?

編輯: 感謝您的反饋意見。我想在cookie中存儲更多數據的原因是因爲我真正需要的對象需要大約2秒鐘的時間才能從我無法控制的服務中恢復。我製作了一個輕量級的對象'KundeContext'來保存完整對象的一些屬性,但是這些都是在90%的時間內使用的。這樣我只需要在我的頁面的10%上調用緩慢的服務。如果我只存儲了ID,我仍然需要在幾乎所有的頁面上調用該服務。

我可以存儲所有的字符串和整數seperately但對象有一個像「contactinformation」和「地址」,這將是乏味的手動存儲每個及其屬性的其他輕量對象。

回答

1

我不會在cookie中存儲XML數據 - 對於初學者來說cookie的大小有限制(對於,所有的頭文件都包含cookie)。選擇較少的詳細編碼策略,例如分隔符,例如a | b | c或單獨的cookie值。分隔編碼使得解碼值特別簡單快捷。

您所看到的錯誤是ASP.NET抱怨頭看起來像一個XSS攻擊。

+0

好點,我會繼續打開問題,然後再接受答案:) – 2008-09-23 08:04:21

5

將序列化數據存儲在cookie中是一個非常非常糟糕的主意。由於用戶完全控制Cookie數據,因此使用此機制爲您提供惡意數據非常容易。換句話說:任何您的反序列化代碼中的弱點會立即被利用(或者至少是一種導致某些事情崩潰的方式)。

相反,只保留最簡單的標識符可能在你的餅乾,一個類型的格式可以很容易地進行驗證的(例如,GUID)。然後,將序列化的數據服務器端存儲(在數據庫中,文件系統上的XML文件或其他),並使用該標識符檢索它。

編輯:另外,在這種情況下,請確保您的標識符足夠隨機,使用戶無法猜測對方的標識符,並通過簡單更改自己的標識符來模擬對方。同樣,GUID(或ASP.NET會話標識符)也適用於此目的。情景澄清問題後主人

第二個編輯:爲什麼在這種情況下,在所有使用自己的餅乾?如果您在會話狀態(Session對象)中保留對原始對象或輕量級對象的引用,ASP.NET將以非常高效的方式爲您處理所有實現細節。

+0

是的,我聽到你 - 我只是添加了一個編輯我的問題。我需要'所有這些數據'來加速事情。標識符CAN給我提供了整個對象,但是這樣做的過程太慢了,我不能做任何事情,因爲它在現有的服務中,我不會篡改。 – 2008-09-23 08:06:48

1

窺視View State。也許你想將ViewState中的數據保留在後臺,而不是使用cookie。否則,您應該將該XML存儲在服務器上,並在cookie中存儲該數據的唯一標識符。

+0

另外一個好點,但我不使用viewstate的原因是因爲有很多新的請求(非回發),所以流不包含在單個頁面上。我實際上是在現有的解決方案上實現這一點,所以我不想更改其他頁面。 – 2008-09-23 08:05:33

0

您可能會考慮使用Session State來存儲該值。您可以將其配置爲使用cookie來存儲會話ID。這也更安全,因爲該值在用戶方面既不可見也不可更改。

另一種替代方法是使用分佈式緩存機制來存儲值。我目前的最愛是Memcached