2014-01-13 68 views
0

我正在寫一個應用程序在asp.mvc。我有一個視圖,顯示具有特定ID的產品,並在該視圖上用戶可以修改產品。有一個顏色下拉列表,用戶可以選擇。可用顏色範圍取決於用戶的權限,並非所有用戶都可以訪問所有顏色。 當用戶點擊「保存」按鈕,ajax請求我們發送到服務器與產品ID和選定的顏色。 下面是問題: 當用戶打開頁面時,我檢查他是否有權編輯帶有URL提供的id的產品,並且僅顯示用戶可以訪問的顏色。但是我不能保證用戶修改保存產品時發送的ajax請求。因此,我可以顯示帶有ID 1的產品和帶有ID 12,13,14的顏色,但用戶可以手動更改請求並將產品ID更改爲3(他不允許編輯),並將顏色選擇爲15(他應該甚至看不到)。ASP MVC - 如何取代viewstate?

在舊的webforms中,這不是問題,因爲產品id可能已經保存在viewstate中,並且在服務器端我檢查選擇了哪個下拉列表,然後我知道選定項的id是什麼存儲在視圖狀態或控制狀態)。你如何解決MVC中的這個問題?當我顯示數據並收到數據時,例如在「保存」請求中,我是否必須檢查用戶是否可以訪問每個元素兩次?

+0

您是否嘗試過使用會話? – RononDex

+0

您可以使用隱藏字段來存儲Id值。 –

回答

1

即使沒有保護和保護的ViewState也可能使您的Web服務器暴露於惡意內容。請注意:

因爲它是由純文本組成的,視圖狀態可能會被篡改。雖然程序員不應該在視圖狀態(例如信用卡號,密碼或連接字符串)中存儲敏感數據,但不言而喻,視圖狀態可用於在服務器上執行攻擊。視圖狀態本身並不是一個安全漏洞,但就像查詢字符串和其他過去可能使用的隱藏字段一樣,它是潛在的惡意代碼工具。由於視圖狀態是編碼,保護和驗證的,因此它提供比其他隱藏字段更多的安全功能,您可以將它們用於自己的編程目的。

as Dino Esposito states here

你有三種選擇:

  1. 保護(加密)您的隱藏字段(當前的productId和顏色)和一個用戶的帖子後,驗證它們在服務器上。

  2. 如果選項3太耗費資源或者您不想在服務器上維護大量驗證邏輯,則使用會話(存儲當前用戶的工作環境,即productId和顏色)。

  3. 驗證用戶發佈後對象的權限。如果選項2不能被接受(你根本不使用會話)。

+0

1.這基本上意味着添加視圖狀態到MVC :)我不是webforms和viewstate的敵人,但是當ASP.MVC提高時,我經常聽說它的優點之一是沒有視圖狀態。 2.你的意思是像解決方案1,但在服務器端?這可能是個好主意,因爲我不想爲瀏覽器和服務器之間的通信添加太多的數據。 3.這很麻煩,因爲對於產品可能有許多相關元素需要驗證。 – Rummy

+0

沒錯,但是你不可能擁有所有三種選擇。這是一種權衡:(保持當前上下文[在HTML =客戶端或在會話=服務器]與驗證用戶每次用戶帖子) –

0

TempData用於維護狀態,它存儲在服務器上用於一個用戶請求。

1

我同意RononDex的回答。 Session爲用戶提供了一種在服務器上爲用戶存儲數據的簡單方法,而無需將數據以他們可以操作的方式公開。

所以,你可以存儲的產品ID如下:

Session["ProductId"] = however you get the id.

另外,你可以存儲的顏色:

Session["Colours"] = // Whatever you want, an array of int or List<int>

沒有與會話狀態的警告,雖然,包括它可以通過該會話到期(您可以控制發生前的分鐘數)或應用程序池刷新來清除,因此請牢記這一點。

這也可能是很好的閱讀了你:

http://brockallen.com/2012/04/07/think-twice-about-using-session-state/

因此,有優點和缺點,會話狀態。如果您決定不使用會話狀態,而是將ID值存儲在HMTL的隱藏字段中,那麼請考慮對這些ID值進行散列或加密,以便用戶無法看到它們是什麼或嘗試對其進行修改。

+0

感謝您的建議,但我不認爲這很簡單。用戶可以多次打開同一頁面,因此需要在頁面的隱藏字段中添加某種「頁面ID」。我想我將不得不採用隱藏字段和會話/緩存的混合解決方案。東西看起來像存儲在服務器上的viewstate(webforms中有這樣的選項)。 – Rummy