在 Asp.Net 中使用电子邮件发送忘记密码

Posted

技术标签:

【中文标题】在 Asp.Net 中使用电子邮件发送忘记密码【英文标题】:Send Forget Password using E Mail in Asp.Net 【发布时间】:2014-10-25 15:17:35 【问题描述】:

我正在使用 asp.net 框架通过电子邮件发送忘记密码。 但我认为我的代码存在一些问题。 请帮忙 。 button_click 事件代码如下。

        protected void frgtbtn_Click(object sender, EventArgs e)
          
             string st = "select E_mail FROM registraion_master WHERE E_mail='" +     Email.Text + "'";

           cmd = new SqlCommand(st, sqlcon);
           cmd.Connection.Open();
           SqlDataAdapter sda = new SqlDataAdapter(cmd);
           DataSet ds=new DataSet();
           sda.Fill(ds);
           cmd.Connection.Close();
           if(ds.Tables[0].Rows.Count > 0)
              
                 MailMessage email = new MailMessage();
                 email.From = new MailAddress(Email.Text); //Enter sender email address.
                 email.To.Add(Email.Text); //Destination Recipient e-mail address.
                 email.Subject = "Your Forget Password:"; //Subject for your request.
                 email.Body = "Hi,Your Password is: " + ds.Tables[0].Rows[0]["Pwd"] + "";

                 email.IsBodyhtml = true;
                 //SMTP SERVER DETAILS
                 SmtpClient smtpc = new SmtpClient("smtp.gmail.com");
                 smtpc.Port = 587;
                 smtpc.UseDefaultCredentials = false;
                 smtpc.EnableSsl = true;
                 gmail_ID.Text = "anuragdixit132@gmail.com";//Enter your gmail id here
                 gmail_pwd.Text="vineet";//Enter your gmail id here
                 smtpc.Credentials = new   NetworkCredential(gmail_ID.Text,gmail_pwd.Text);
                 smtpc.Send(email);
                 string script = @"<script language=""javascript""> alert('Password Has Been Sent.......!!!!!.');
                 </script>;";
                 Page.ClientScript.RegisterStartupScript(this.GetType(), "myJScript1", script);
                
              else
                
                pwdlbl.Text = "This email address is not exist in our Database try again";
                

在此代码中:出现异常:列'Pwd'不属于表Table。

【问题讨论】:

我怀疑您将密码存储为纯文本。 不要那样做! 请阅读:Implement password recovery best practice 您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。 列 'Pwd' 不在表中 是否不太明显,正如@SonerGönül 所说,不要像那样存储密码 哦,'Pwd' 不在表中的原因很可能是因为您在 select 语句中只获得了 E_mail 列,然后不使用它,以及使用在 select 子句中带有文本条目的非参数化查询... 除了不将密码存储为纯文本之外,您还应该使用parameterized queries而不是使用字符串连接来构建您的sql字符串(WHERE E_mail='" + Email.Text + "' @AnuragDixit 声明列'Pwd'不属于表Table的地方表示在数据集中,这是您的选择语句SELECT E_mail FROM的结果。您只选择 E_mail,因此结果集中只存在 E_mail。如果它是你自己的项目也没关系,但我仍然会推荐好的做法。 【参考方案1】:

重现问题的最短方法:

   string st = "select E_mail FROM registraion_master WHERE E_mail='" +     Email.Text + "'";
   cmd = new SqlCommand(st, sqlcon);
   cmd.Connection.Open();
   SqlDataAdapter sda = new SqlDataAdapter(cmd);
   DataSet ds=new DataSet();
   sda.Fill(ds);
   cmd.Connection.Close();
   ds.Tables[0].Rows[0]["Pwd"];

很明显,您查询的数据库仅用于 E_mail 而不是 Pwd。如果 Pwd 是 registraion_master 表的一部分,则解决方案可以是:

  string st = "select E_mail,Pwd FROM registraion_master WHERE E_mail='" +     Email.Text + "'";

但是我希望密码不是以明文形式保存的。并开始使用参数化查询,您的查询会受到 sql 注入。而且我猜你在屏幕上显示用户输入时也有跨站点脚本问题,当你向用户发送密码时你有跨站点脚本......

【讨论】:

我希望我不是您网站上的用户...修复您的 sql 注入和跨站点脚本。最好是在用户丢失旧密码时向他们发送新密码。

以上是关于在 Asp.Net 中使用电子邮件发送忘记密码的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.Net 发送电子邮件而不在代码中显示我的密码

如何以管理方式为忘记密码的 ASP.net 身份用户设置新密码?

PHP发送忘记密码的电子邮件

KeyCloak 忘记密码 电子邮件链接

使用 bcrypt 输入密码 - 忘记密码的电子邮件

使用 ASP.Net 从 HTML 发送电子邮件