【问题标题】:Forgot Password in windows form c#在windows窗体c#中忘记密码
【发布时间】:2020-03-22 22:46:40
【问题描述】:

在下面的代码中:我想在用户尝试输入与数据库关联(不)关联的电子邮件时警告用户。当我输入某些内容不在我的数据库中时,它会显示“您的记录不在我们的数据库中”。但是当我输入有效的电子邮件时,它会显示:输入字符串的格式不正确
所以这行代码不起作用:smtpClient.Send(message);

    string randomCode = "";
    public static string to;
    public ForgotPassword()
    {
        InitializeComponent();
    }

    private void btn_EmailSend_Click(object sender, EventArgs e)
    {
        string from, pass, messagebody;
        #region Generating random code
        Random ran = new Random();
        string randText = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        int Length_randText = randText.Length;
        for (int i = 0; i < 5; i++)
        {
            randomCode += randText[ran.Next(Length_randText)];
        }
        #endregion

        MailMessage message = new MailMessage();
        to = txt_Email.Text;
        from = "------";
        pass = "------";
        messagebody = "You have requested to reset your password. Enter this \"" + randomCode + "\" - code to change your password";
        message.To.Add(to);
        message.From = new MailAddress(from);
        message.Body = messagebody;
        message.Subject = "Password resetting request";
        SmtpClient smtpClient = new SmtpClient("smtp.gmail.com");
        smtpClient.EnableSsl = true;
        smtpClient.Port = 587;
        smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtpClient.Credentials = new NetworkCredential(from, pass);
        try
        {
            using (DALC.GetConnection())
            {
                SqlCommand cmd = new SqlCommand("select email from loginuser where email = '" + to + "'", DALC.con);
                object result = cmd.ExecuteScalar();
                if (Convert.ToInt16(result)>0)
                {
                    smtpClient.Send(message);
                    MessageBox.Show("I have sent your resetting code to you email. Check your inbox :)", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Your record is not in our database");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

【问题讨论】:

  • 与您的问题无关,但请阅读有关 SQL 注入的信息。
  • 我在您的代码中没有看到“发件人”的有效电子邮件
  • 如果您检查异常,您将获得有关问题的更多详细信息。
  • 您收到错误是因为您正在使用 ExecuteScaler 从数据库 (select email from loginuser …) 中选择一封电子邮件,其中 "执行查询,并返回第一列查询返回的结果集中的第一行。” - 这将返回一个字符串,然后您在该字符串上调用Convert.ToInt16,然后抛出您看到的异常。您可以改用COUNT(*),但您必须参数化您的查询 - 请参阅xkcd.com/327
  • 在“result 不是我所期望的”之后的基本调试步骤是查看该结果真正是什么。然后您会看到您正在将电子邮件地址转换为 Int16。

标签: c# sql winforms forgot-password


【解决方案1】:

您实际上不应该这样做,这被认为是不好的做法。恶意用户永远无法猜出有效的电子邮件地址(在您的情况下他可以猜到)。

只有在用户正确输入电子邮件地址的情况下,您才应向用户提供带有密码重置功能的电子邮件。即使电子邮件地址不在您的数据库中,也只会出现一条没有数据泄漏的消息,即“重置密码的电子邮件已发送到您的地址”。

同样的问题也适用于登录:如果登录失败,用户应该只会收到一条无法区分名称/密码的消息,例如“您输入的用户名或密码无效”。

有关更多信息,另请参阅this question

【讨论】:

  • 假设您使用电子邮件注册并忘记了密码,当您输入有效的电子邮件时,我的应用程序会向您的电子邮件发送重置代码。此代码有效如果我替换此代码“
  • SqlCommand cmd = new SqlCommand("select email from loginuser where email = '" + to + "'", DALC.con);对象结果 = cmd.ExecuteScalar(); if (Convert.ToInt16(result)>0) { smtpClient.Send(message); MessageBox.Show("我已将您的重置代码发送给您的电子邮件。请检查您的收件箱:)", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("您的记录不在我们的数据库中"); }
  • 只有这个:smtpClient.Send(message);
  • @AlishSafarli 那是因为你没有在电子邮件地址上调用 Convert.ToInt16!
猜你喜欢
  • 2013-11-01
  • 2012-07-25
  • 2015-10-29
  • 2015-05-17
  • 2011-08-28
  • 1970-01-01
  • 2012-02-09
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多