0

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

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");

我的表结构是

我的表结构
找不到我的错误。谢谢。

4

4 回答 4

6

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

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

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

虽然您不能参数化表名,但您应该确保它只来自受信任的代码——而不是通过用户输入,例如,否则您将再次遇到完全相同的 SQL 注入问题

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

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

于 2012-05-13T07:37:41.357 回答
1

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

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

于 2012-05-13T07:35:46.087 回答
0

你必须逃避你的参数,

此外,你不应该使用直接的 SQL 命令,你应该使用SQL 参数化

            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;
                }
            }
于 2012-05-13T07:40:25.047 回答
0
cmd.CommandText = "select count(UserName) from " + tblName + " where Password='" + Password + "' and usertype='" + Usertype + "' and username='"+ UserName + "'";

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

于 2012-05-15T15:00:02.083 回答