我在使用ASP.net时遇到了一些麻烦。我有一个小的DataTable,我需要依赖页面,用户也无法访问。我的意思是:
如果我将DataTable中的数据存储在Hiddenfield中,则隐藏字段取决于页面(多个相同页面的值不同) 请求),但用户无法访问,因为用户可以修改它 内容然后回复。
- 醇>
如果我将Datatable存储在会话中,那就是用户无法访问(这很好),但由于页面中的某些内容依赖于 此值,如果用户多次打开页面(在不同的位置) 选项卡)然后使用最后一页的内容更新会话 请求,因此如果没有正确呈现“旧”页面 发生回发。
示例:获取整数变量。这是敏感信息。我需要保存此值,以便用户无法修改它,并且每个页面也可以有不同的值(与hiddenfield相同)。我怎样才能做到这一点?谢谢!
PS:我正在使用带有C#的ASP.net 4.0
答案 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攻击),但它比将信息存储在发送给客户端的数据中更安全。