如果用户忘记了与用户名和完整密码匹配的密码,我试图允许用户重置/更新密码,以便重置密码。然而;我不断收到错误消息,用户名和名称不匹配,即使它们匹配。
string strConnString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string str = null;
SqlCommand com;
byte up;
protected void btn_update_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(strConnString);
con.Open();
try
{
string un, pw;
un = txtUsername.Text;
pw = Encrypt(txt_npassword.Text, "mykey");
SqlCommand command = new SqlCommand("PP_spReset", con);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = un;
command.Parameters.Add("@password", SqlDbType.VarChar).Value = pw;
con.Open();
int rowupdated = command.ExecuteNonQuery();
if (rowupdated > 0)
{
Response.Redirect(@"~/Account/Login.aspx"); ;
}
else
{
lbl_msg.Text = "Username does not exist";
}
}
catch (Exception ex)
{
throw ex;
}
}
public string Encrypt(string source, string key)
{
TripleDESCryptoServiceProvider desCryptoProvider = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider();
byte[] byteHash;
byte[] byteBuff;
byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
desCryptoProvider.Key = byteHash;
desCryptoProvider.Mode = CipherMode.ECB; //CBC, CFB
byteBuff = Encoding.UTF8.GetBytes(source);
string encoded =
Convert.ToBase64String(desCryptoProvider.CreateEncryptor().TransformFinalBlock(byteBuff, 0, byteBuff.Length));
return encoded;
}
答案 0 :(得分:0)
您的第一个问题是错误处理,由于要屏蔽它,所以无法知道错误是什么。
您有一些选择,但是您需要定义错误(我将其定义为e):
选项1-将其写到您的消息中(不应在生产环境中这样做,因为它会为客户端(潜在的黑客)提供过多有关您的基础结构的信息,但这只是一个开始)。
选项2-引发异常,让IIS决定要做什么。在DEV模式下,在配置文件中设置customErrors属性:
<customErrors mode="RemoteOnly"></customErrors>
选项3-发出友好消息,但将信息记录到服务器(文件)或数据库中。但是,该代码将根据您的实现方式而有所不同。
无论哪种方式,您都需要知道错误是什么,否则您将无法修复它。为简单起见,我有一个与#2有关的代码更新,但是在生产中,您最终应该真正使用#3。
catch (Exception e)
{
throw e;
}
此外,您还有一个SQL注入问题,需要使用SQL参数来更正。以下是有关该主题的一些帖子: