各位大侠,我知道使用存储过程做登录就可以实现防止用户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: 输入字符串的格式不正确。
请高手们帮一下小弟吧。谢谢了!!

解决方案 »

  1.   

    把sqldbtype.varchar改成nvarchar试试
    再就是单步跟踪,才能准确定位错误.
      

  2.   

    使用存储过程(动态拼语句的除外)和带参数的SQL语句方式执行,已经有效的防止了注入了, 不用考滤这个问题.
      

  3.   

    我时这么写的:
    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;
            }
        }
      

  4.   

    password 格式不正确.DB接收nvarcharASP输入SqlDbType.VarChar
      

  5.   

    呵呵。自己搞定了。我用
    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()); 
    时就出错!谢谢各位了!!!