2

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

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

  2. 如果我将数据表存储在会话中,则用户无法访问(这很好),但由于页面中的某些内容取决于此值,如果用户多次打开页面(在不同的选项卡中),则会话将更新为如果发生回发,则请求的最后一页的内容以及因此“较旧”的页面不会正确呈现。

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

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

4

1 回答 1

3

为隐藏字段添加唯一键;使用此键访问特定于页面实例的唯一会话值。即使有人猜到了别人的唯一密钥,如果没有会话密钥,它也将毫无用处。

例子:

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

在第一次呈现页面实例时生成此值:

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

从特定于该页面的 Session 中检索值时:

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% 安全的(例如会话固定攻击),但它比将信息存储在发送给客户端的数据中要安全几个数量级。

于 2013-01-11T20:15:17.533 回答