ASP.net敏感信息存储

时间:2013-01-11 20:12:15

标签: asp.net session datatable postback hiddenfield

我在使用ASP.net时遇到了一些麻烦。我有一个小的DataTable,我需要依赖页面,用户也无法访问。我的意思是:

  
      
  1. 如果我将DataTable中的数据存储在Hiddenfield中,则隐藏字段取决于页面(多个相同页面的值不同)   请求),但用户无法访问,因为用户可以修改它   内容然后回复。

  2.   
  3. 如果我将Datatable存储在会话中,那就是用户无法访问(这很好),但由于页面中的某些内容依赖于   此值,如果用户多次打开页面(在不同的位置)   选项卡)然后使用最后一页的内容更新会话   请求,因此如果没有正确呈现“旧”页面   发生回发。

  4.   

示例:获取整数变量。这是敏感信息。我需要保存此值,以便用户无法修改它,并且每个页面也可以有不同的值(与hiddenfield相同)。我怎样才能做到这一点?谢谢!

PS:我正在使用带有C#的ASP.net 4.0

1 个答案:

答案 0 :(得分: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攻击),但它比将信息存储在发送给客户端的数据中更安全。