2013-01-11 280 views
2

我在使用ASP.net時遇到了一些麻煩。我有一個小的DataTable,我需要頁面依賴,也是用戶無法訪問。我的意思是:ASP.net敏感信息存儲

  1. 如果我存儲從Hiddenfield內的數據表中的數據,hiddenfield是頁面相關的(多個同一頁面 要求不同的值),但它不是用戶無法訪問,因爲用戶可以修改其內容 ,然後發回。

  2. 如果我存儲在會話數據表,即用戶無法訪問(這是好的),但因爲某些網頁中的內容取決於 這個值,如果用戶打開頁面多次(在不同的 標籤),那麼該會話將被更新爲請求的最後一頁 中的內容,因此如果 發生回發,則「舊」頁面將無法正確呈現。

示例:取一個整型變量。這是敏感信息。我需要保存這個值,以便用戶不能修改它,並且每個頁面也可以有不同的值(與隱藏字段相同)。我怎樣才能做到這一點?謝謝!

PS:我使用ASP.net 4.0與C#

回答

3

添加唯一鍵的隱藏字段;使用此鍵訪問特定於頁面實例的唯一會話值。即使有人猜到別人的唯一密鑰,沒有會話密鑰也沒用。

實施例:

<input type="hidden" value="234092735029730" id="InstanceId" runat="server" /> 

首次頁面的實例被呈現生成此值:

if(!Page.IsPostback){ 
    this.InstanceId.Value = GenerateKey().ToString(); 
} 

當檢索從會話特定於該頁面的值:

string key = this.InstanceId.Value; 
var value = Session[key]; 

要生成一個頁面唯一的ID,這樣的事情會工作:

using System.Security.Cryptography; 

private static RNGCryptoServiceProvider _crypto = new RNGCryptoServiceProvider(); 

public static long GenerateKey(){ 
    byte[] bytes = new byte[8]; 
    _crypto.GetBytes(bytes); 
    return BitConverter.ToInt64(bytes, 0); 
} 

請記住,該會話不一定100%安全(例如, Session fixation攻擊),但它比存儲發送到客戶端的數據中的信息更安全。

+1

美麗的做法。在完成之後,我會將其標記爲已回答:)謝謝。 – osmiumbin

+1

非常好。另外需要注意的是:如果你將大數據(如DataTable)放入Session中,請嘗試清理所有這些獨特的副本。例如,如果用戶單擊表單上的「關閉」按鈕,則可以從會話中刪除該特定實例。當然,如果他們關閉瀏覽器,你不會做太多事情。 –

+0

數據表很小(4列x 20行所有整數 - 所以我想是非常小)。一個問題:所有那些會話實例在用戶關閉瀏覽器時處置是?我想會議對象不是全球所有用戶都可以訪問的(用戶1的Session [key]對用戶2來說是不可訪問的嗎?)。再次感謝! – osmiumbin