ASP.NET WebForms - 将 ViewState 保存到数据库 - ViewState 验证不起作用
创始人
2024-09-17 00:31:22
0

在ASP.NET WebForms中,ViewState默认是保存在页面的隐藏字段中的。但是,你可以通过自定义的方式将ViewState保存到数据库中。下面是一个示例解决方法,包含了代码示例:

  1. 创建一个名为ViewStateDB的数据库,其中包含两个字段:ID(主键)和ViewState(用于保存ViewState的字段)。

  2. 在页面的CodeBehind文件中,添加以下代码来将ViewState保存到数据库中:

protected override object LoadPageStateFromPersistenceMedium()
{
    string viewStateID = Request.QueryString["viewStateID"];

    if (!string.IsNullOrEmpty(viewStateID))
    {
        // 从数据库中获取ViewState
        string connectionString = "Your connection string";
        string query = "SELECT ViewState FROM ViewStateDB WHERE ID = @ID";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, connection);
            command.Parameters.AddWithValue("@ID", viewStateID);

            connection.Open();
            byte[] viewStateBytes = (byte[])command.ExecuteScalar();

            if (viewStateBytes != null)
            {
                // 将从数据库中获取的ViewState反序列化并返回
                LosFormatter formatter = new LosFormatter();
                return formatter.Deserialize(Convert.ToBase64String(viewStateBytes));
            }
        }
    }

    return null;
}

protected override void SavePageStateToPersistenceMedium(object state)
{
    string viewStateID = Request.QueryString["viewStateID"];

    if (!string.IsNullOrEmpty(viewStateID))
    {
        // 将ViewState序列化并保存到数据库中
        LosFormatter formatter = new LosFormatter();
        StringWriter writer = new StringWriter();
        formatter.Serialize(writer, state);
        string serializedState = writer.ToString();

        byte[] viewStateBytes = Convert.FromBase64String(serializedState);

        string connectionString = "Your connection string";
        string query = "INSERT INTO ViewStateDB (ID, ViewState) VALUES (@ID, @ViewState)";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, connection);
            command.Parameters.AddWithValue("@ID", viewStateID);
            command.Parameters.AddWithValue("@ViewState", viewStateBytes);

            connection.Open();
            command.ExecuteNonQuery();
        }
    }
}
  1. 在页面的OnInit事件中,添加以下代码来验证ViewState是否被篡改:
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    // 防止篡改ViewState
    Page.ViewStateUserKey = Session.SessionID;
}

请注意,这只是一个示例解决方法,你可能需要根据自己的实际需求进行调整。同时,确保替换代码中的“Your connection string”为实际的数据库连接字符串。

相关内容

热门资讯

据统计!欢聚水鱼辅助插件(辅助... 您好,欢聚水鱼辅助插件这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩...
透视最新!uupoker透视,... 透视最新!uupoker透视,小程序微乐辅助器ios,指南辅助软件(有挂猫腻)-哔哩哔哩在进入小程序...
为切实保障!蜀山四川辅助脚本视... 为切实保障!蜀山四川辅助脚本视频教学(辅助)竟然是有辅助挂(有挂规律)-哔哩哔哩进入游戏-大厅左侧-...
现有关情况通报如下!xpoke... 现有关情况通报如下!xpoker辅助控制,途游大作战辅助,学习辅助攻略(有挂解惑)-哔哩哔哩1、途游...
昨日!新星游挂多少钱(辅助)总... 昨日!新星游挂多少钱(辅助)总是是真的辅助神器(有挂分享)-哔哩哔哩1)新星游挂多少钱辅助插件:进一...
透视挂透视!pokemmo辅助... 透视挂透视!pokemmo辅助官网,蜀山四川小程序作必弊视频,操作辅助脚本(有挂方法)-哔哩哔哩在进...
受玩家影响!悟空大厅怎么挂辅助... 受玩家影响!悟空大厅怎么挂辅助(辅助)其实是有辅助挂(的确有挂)-哔哩哔哩1、悟空大厅怎么挂辅助免费...
这一问题亟待解决!花舍辅助(辅... 这一问题亟待解决!花舍辅助(辅助)真是真的有辅助app(真的有挂)-哔哩哔哩1、完成花舍辅助有辅助插...
透视神器!竞技联盟辅助插件,忆... 透视神器!竞技联盟辅助插件,忆游十三道辅助,学习辅助教程(有挂解密)-哔哩哔哩运竞技联盟辅助插件辅助...
据权威媒体报道!抚州辅助器中至... 据权威媒体报道!抚州辅助器中至小程序(辅助)其实真的有辅助器(有挂攻略)-哔哩哔哩1、上手简单,内置...