2013-01-11 168 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