You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何实现用户每日仅可修改一次密码的功能?

实现每日仅允许修改一次密码的方案

嘿,要搞定这个每日改密码的限制,咱们得从数据库存储修改记录和代码逻辑校验两部分下手,下面是具体的实现步骤和代码调整:

1. 先调整数据库结构

首先得在数据库里存下用户改密码的时间,有两种实用方案:

方案A:给现有User表加字段

直接在你的User表里新增一个last_password_change_date字段(类型选datetime或者date都行),专门用来存用户最近一次改密码的时间。

方案B:建独立的密码修改日志表

要是你想保留所有改密码的历史记录,可以新建一张PasswordChangeLog表,至少包含这些字段:

  • log_id(主键,自增)
  • userName(关联User表的用户名)
  • change_date(修改时间,datetime类型)

2. 修改代码逻辑(以方案A为例)

咱们要在原有的改密码流程前,先加一步“今日是否已修改过”的校验,同时还得把原代码里的SQL注入问题给补上(原代码用字符串拼接SQL太危险了!),调整后的代码如下:

// 先校验新密码和确认密码是否一致
if (txtNewPassword.Text == txtConfirmPassword.Text)
{
    // 第一步:检查用户今天有没有改过密码
    string checkChangeLogSql = "SELECT COUNT(*) FROM User WHERE userName = @UserName AND CONVERT(date, last_password_change_date) = CONVERT(date, GETDATE())";
    // 用参数化查询杜绝SQL注入,一定要这么写!
    SqlParameter[] checkParams = new SqlParameter[]
    {
        new SqlParameter("@UserName", txtUserName.Text)
    };
    int changeCount = Convert.ToInt32(mDBHelper.ExecuteScalar(checkChangeLogSql, checkParams));

    if (changeCount > 0)
    {
        MessageBox.Show("您今天已经修改过密码啦,每日只能改一次哦!");
        return;
    }

    // 第二步:校验原密码是否正确(原逻辑保留,同样改成参数化)
    string verifyUserSql = "SELECT * FROM User WHERE userName = @UserName AND password = @OldPassword";
    SqlParameter[] verifyParams = new SqlParameter[]
    {
        new SqlParameter("@UserName", txtUserName.Text),
        new SqlParameter("@OldPassword", txtPassword.Text)
    };
    mDT_Save = mDBHelper.GetTable(verifyUserSql, verifyParams);

    if (mDT_Save.Rows.Count > 0)
    {
        // 第三步:更新密码+记录修改时间
        string updatePasswordSql = "UPDATE User SET password = @NewPassword, last_password_change_date = GETDATE() WHERE userName = @UserName";
        SqlParameter[] updateParams = new SqlParameter[]
        {
            new SqlParameter("@NewPassword", txtConfirmPassword.Text),
            new SqlParameter("@UserName", txtUserName.Text)
        };
        mDBHelper.ExecuteSQLNonQuery(updatePasswordSql, updateParams);

        MessageBox.Show("Password Changed Successfully");
        txtPassword.Text = txtConfirmPassword.Text;
        return;
    }
    else
    {
        MessageBox.Show("User Not Found or Old Password Incorrect");
        return;
    }
}
else
{
    MessageBox.Show("New Password and Confirm Password do not match!");
}

3. 几个重要提醒

  • 必须用参数化查询:原代码直接拼接SQL字符串,很容易被SQL注入攻击,上面的代码已经改成了参数化,一定要坚持用这种方式!
  • 时间适配不同数据库:如果你的数据库不是SQL Server,比如用MySQL,那日期转换的函数得换成DATE(NOW()),对应调整SQL里的日期判断部分。
  • 处理历史用户数据:要是给已有的User表加last_password_change_date字段,记得给老用户设置一个早于今天的默认值(比如'1900-01-01'),不然他们第一次改密码会被限制。

要是你选方案B(独立日志表),校验逻辑就改成查PasswordChangeLog里今天该用户的记录数,改完密码后往日志表里插一条新记录就行,核心逻辑和上面是一样的。

内容的提问来源于stack exchange,提问作者user7261203

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:46