各位大侠,我知道使用存储过程做登录就可以实现防止用户SQL注入功击。但是我做了好久都做不出来啊。请各位帮一下!谢谢了。我ASP.NET中的程序代码:
string teacherPassword = txtTeacherOk.Text;//提取输入的密码
SqlConnection con = db.createCon();//创建connection
con.Open();
SqlCommand cmd = new SqlCommand("teacherLogin", con);//teacherLogin为我用SQL创建的存储过程的名称。
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter teacherpass = new SqlParameter("@t_password", SqlDbType.VarChar, 32);//@t_password存储过程中接收密码的参数
teacherpass.Value = teacherPassword;
cmd.Parameters.Add(teacherpass);
int count = Convert.ToInt32(cmd.ExecuteScalar());
if(count>0)
{
Session["studentID"] = txtStudentID.Text;
Response.Redirect("testMain.aspx");
}
else
{
lblPwdErorr2.Text = "密码错误!!!";
}
用下面的语句创建了存储过程:create procedure teacherlogin
@t_password nvarchar(20)
as
select teacherpassword
from admin
where teacherpassword=@t_password
运行时的出错信息:
输入字符串的格式不正确。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.FormatException: 输入字符串的格式不正确。
请高手们帮一下小弟吧。谢谢了!!
string teacherPassword = txtTeacherOk.Text;//提取输入的密码
SqlConnection con = db.createCon();//创建connection
con.Open();
SqlCommand cmd = new SqlCommand("teacherLogin", con);//teacherLogin为我用SQL创建的存储过程的名称。
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter teacherpass = new SqlParameter("@t_password", SqlDbType.VarChar, 32);//@t_password存储过程中接收密码的参数
teacherpass.Value = teacherPassword;
cmd.Parameters.Add(teacherpass);
int count = Convert.ToInt32(cmd.ExecuteScalar());
if(count>0)
{
Session["studentID"] = txtStudentID.Text;
Response.Redirect("testMain.aspx");
}
else
{
lblPwdErorr2.Text = "密码错误!!!";
}
用下面的语句创建了存储过程:create procedure teacherlogin
@t_password nvarchar(20)
as
select teacherpassword
from admin
where teacherpassword=@t_password
运行时的出错信息:
输入字符串的格式不正确。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.FormatException: 输入字符串的格式不正确。
请高手们帮一下小弟吧。谢谢了!!
再就是单步跟踪,才能准确定位错误.
App_code中的代码,用来调用的。public static bool UserLogin(string UserName,string Pass)
{
string connstr = ConfigurationSettings.AppSettings["connstr"];
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd = new SqlCommand("UserLoginCheck", conn);
cmd.CommandType = CommandType.StoredProcedure; SqlParameter ParameterUserName = new SqlParameter("@UserName", SqlDbType.NVarChar, 12);
ParameterUserName.Value =UserName;
cmd.Parameters.Add(ParameterUserName); SqlParameter ParameterPass = new SqlParameter("@Pass", SqlDbType.NVarChar, 12);
ParameterPass.Value = Pass;
cmd.Parameters.Add(ParameterPass); SqlParameter ParameterUserID = new SqlParameter("@UserID", SqlDbType.Int, 4);
ParameterUserID.Direction = ParameterDirection.Output;
cmd.Parameters.Add(ParameterUserID); conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
int GetParameterCheck=(int)(ParameterUserID.Value); if (GetParameterCheck == 0)
{
return false;
}
else
{
return true;
}
}
try
{
sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if(sdr.Read())
{
Session["adminID"] = adminName;
Session["adminPwd"] = adminPwd;
Response.Redirect("adminMain.aspx");
lblErorr.Text = "";
}
else
{
lblErorr.Text = "用户名或密码错误!!!";
}
}
catch (SqlException ex)
{
lblErorr.Text = "程序有异常!!";
}解决了。用int count = Convert.ToInt32(cmd.ExecuteScalar());
时就出错!谢谢各位了!!!