【问题标题】:SQLException was unhandled by user code in C#C# 中的用户代码未处理 SQLException
【发布时间】:2012-05-21 03:39:57
【问题描述】:

我尝试检查用户是否存在。我尝试:

public static bool GetUser(string tblName, string UserName,string Password,string Usertype)
        {
            try
            {

                using (SqlConnection con = Connection.GetConnection())
                {
                    using (SqlCommand cmd = con.CreateCommand())
                    {
                       cmd.CommandText = "select count(UserName) from " + tblName + " where Password=" + Password + " and usertype=" + Usertype + " and username="+ UserName + "";
                        object obj = cmd.ExecuteScalar();
                        if (obj != null)
                            return true;
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

当我调用此方法时,出现以下错误。

连接已成功建立,我这样调用此方法。

bool Check = UserLogin.GetUser("OnlineCertificationLogin", "admin", "admin", "Admin");

我的表结构是


找不到我的错误。谢谢。

【问题讨论】:

    标签: c# asp.net sql sql-server-2005


    【解决方案1】:
    cmd.CommandText = "select count(UserName) from " + tblName + " where Password='" + Password + "' and usertype='" + Usertype + "' and username='"+ UserName + "'";
    

    试试这个,我猜你关于 ' 的问题。

    【讨论】:

      【解决方案2】:

      你必须逃避你的参数,

      另外,你不应该使用直接的 SQL 命令,你应该使用SQL parameterization

                  using (SqlConnection con = Connection.GetConnection())
                  {
                      using (SqlCommand cmd = con.CreateCommand())
                      {
                          cmd.CommandText = @"SELECT count(UserName) FROM" + tblName +
                          " WHERE Password=@pPass AND usertype=@pUsertype AND
                          username=@pUsername";
                          cmd.Parameters.Add("@pUsername", SqlDbType.VarChar);
                          cmd.Parameters.Add("@pPass", SqlDbType.VarChar);
                          cmd.Parameters.Add("@pUsertype", SqlDbType.VarChar);
                          cmd.Parameters["pUsername"] = UserName;
                          cmd.Parameters["pPass"] = Password;
                          cmd.Parameters["pUsertype"] = Usertype;
                          object obj = cmd.ExecuteScalar();
                          if (obj != null)
                              return true;
                          return false;
                      }
                  }
      

      【讨论】:

        【解决方案3】:

        您没有引用这些值,因此您的 SQL 最终结果为:

        select count(UserName) from OnlineCertificationLogin
        where Password=admin and usertype=admin and username=Admin
        

        不要通过添加引号来解决此问题。然后,您的代码将工作 用于给出的示例,但您很容易受到SQL injection attacks 的攻击。相反,您应该使用参数化查询来解决此问题 - 有关更多信息和示例,请参阅 SqlCommand.Parameters

        虽然您无法参数化表名,但您应该确保它永远来自受信任的代码 - 例如,而不是通过用户输入,否则您会得到完全相同的又是 SQL 注入问题。

        请注意,您不应该像那样以纯文本形式存储密码。

        我强烈建议你拿一本关于安全的书——Beginning ASP.NET Security 可能就在你身边。 (我有一份副本,但我承认没读多少——不过我听过 Barry 谈论安全,他解释得非常清楚。)

        【讨论】:

          【解决方案4】:

          我认为这都是关于将字符串值注入到最终的SQL query

          不要使用简单的字符串连接,而是使用SqlParameter 将值注入查询中,您的问题很可能会得到解决。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-23
            • 1970-01-01
            • 2016-06-24
            • 1970-01-01
            • 2016-06-19
            相关资源
            最近更新 更多