【问题标题】:ASP.net sensitive information storageASP.net 敏感信息存储
【发布时间】:2012-12-26 11:49:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net session datatable postback hiddenfield


    【解决方案1】:

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

    例子:

    <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 );
    }
    

    请记住,Session 不一定是 100% 安全的(例如 Session fixation 攻击),但它比将信息存储在发送给客户端的数据中要安全几个数量级。

    【讨论】:

    • 漂亮的方法。完成后我会将其标记为已回答:) 谢谢。
    • 优秀。附加说明:如果您将大数据(如 DataTable)放入 Session,请尝试清理所有这些唯一副本。例如,如果用户单击表单上的“关闭”按钮,您可以从会话中删除该特定实例。当然,如果他们只是关闭浏览器,您将无能为力。
    • 数据表很小(4 列 x 20 行所有整数 - 所以我猜很小)。一个问题:当用户关闭浏览器时,所有这些会话实例都会被释放是吗?而且我认为所有用户都无法全局访问会话对象(用户 2 无法访问用户 1 的会话 [key] 对吗?)。再次感谢!
    • 是的,每个用户的会话都是唯一的。你根本不需要担心这个。用户关闭浏览器时不会立即放弃会话,但会在超时后自动清理。
    猜你喜欢
    • 2015-05-03
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多