0

我目前正在使用asp.net MVC創建一個應用程序,我需要驗證用戶是否已經爲他預先生成的內容中選擇了值。根據服務器生成的數據驗證用戶輸入

簡單流程示例:

- 服務器生成一組值:{10%,20%,30%,40%,50%} - 查看示出了具有產生給該用戶的值的下拉 - 用戶必須只選擇其中一個預生成值

考慮到用戶可以修改html並在下拉列表中放置一個隨機值 - 例如80%。我將如何限制/防止這種行爲?

我目前正在考慮使用MemoryCache來存儲允許值的集合並使用用戶ID作爲鍵。不知道是否是最好的解決方案。任何建議將非常感激。

+0

如果在頁面呈現時您有提供給用戶的值,那麼當您以相同方式提交表單並將其與用戶輸入進行比較時,您可以訪問相同的值嗎? – jdurc

+0

@jdurc不是那麼簡單,因爲用戶(正如我之前所說的)可以僞造表單上的值以包含他想要的任何內容。 所以如果服務器已經生成了一組{10%,20%},用戶可以簡單地將它變爲{50%,100%}。然後{50%,10%}將被髮回給控制器,而服務器不知道之前生成的內容。即使用戶修改了頁面上的html,也可以將預生成的值放在哪裏進行驗證。 –

+0

我不太確定你是否理解我的問題。你最初如何爲用戶生成這些值,爲什麼你不能再次做同樣的事情來比較它們與用戶輸入? – jdurc

回答

0

解決方案比我想象的要簡單。我所做的主要是:

  1. 生成值(例如:10%,20%,30%,40%,50%)
  2. 哈希值,並把它放入視圖模型
  3. 與計算哈希創建一個隱藏的輸入
  4. 散列值公佈,並檢查其是否等於先前散列

對我來說,我使用的是比較ValidationAttribute檢查哈希,所以用戶只能如果爲他生成的值是正確的,請提交表格。

1

這是一個有趣的問題。儘管如此,MemoryCache是一個不錯的選擇。你放在那裏的任何東西都可以保證在那裏,更不用說留下任何可靠的時間。這完全取決於服務器上發生了什麼。如果某個過程需要更多的內存,MemoryCache將是第一要做的。如果應用程序池回收,崩潰,服務器重新啓動等MemoryCache中的任何內容都消失了。而且,如果您使用多個工作人員(網上服務器場),則他們之間不會共享MemoryCache,從而導致可能或不可用的奇怪問題,具體取決於用戶每次請求登錄哪個工作人員。

Session可能是儘可能簡單地堅持值的最佳場所,但您需要確保會話存儲區類似於SQL Server,Redis等。如果使用In Proc,則會與MemoryCache具有相同的問題,甚至StateServer可能是易失性的,儘管它至少比In Proc更好。在會話中存儲還可確保用戶無法修改值。