使用参数.AddWithValue传递数据库名称失败

本文关键字:数据库 失败 参数 AddWithValue | 更新日期: 2023-09-27 18:03:20

我一直在尝试执行登录查询。我认为这个函数的主要问题是Parameters.AddWithValue部分,但我真的不明白什么是错的。

下面的代码在运行时返回一个错误:

必须声明表变量"@database"

代码:

 public static bool clsFuncLogin(string USER, string PASS, 
         string conStr, string strDatabase)
{
    SqlConnection conn = new SqlConnection(
       ConfigurationManager.ConnectionStrings[conStr].ConnectionString);
    conn.Open();

    using (SqlCommand StrQuer = 
         new SqlCommand("SELECT COUNT(*) FROM @database "+ 
            "WHERE Username = @userid AND Password = @password", conn))
    {
        StrQuer.Parameters.AddWithValue("@userid", USER);
        StrQuer.Parameters.AddWithValue("@password", PASS);
        StrQuer.Parameters.AddWithValue("@database", strDatabase);
        int DataQuery = Convert.ToInt32(StrQuer.ExecuteScalar().ToString());
        if (DataQuery == 1)
        {
            System.Web.HttpContext.Current.Session["User"] = USER;
            System.Web.HttpContext.Current.Session["Pass"] = PASS;
            System.Web.HttpContext.Current.Session["loggedIn"] = "True";
            return true;
        }
        else if (DataQuery > 1)
        {
           //to tell if a double is created in the db
           //probably to be removed
            System.Web.HttpContext.Current.Session["Double"] = USER;
            return false;
        }
        else 
        {
            return false;
        }
    }
}

我也做了查询

"SELECT COUNT(*) FROM" + strDatabase + " WHERE Username = " + USER + 
        " AND Password = " + PASS;

但我被告知这是不好的做法。任何建议吗?

使用参数.AddWithValue传递数据库名称失败

我从未见过表名作为参数传递,并且基于其他帖子(例如这个和这个),我认为它不容易做到…至少,不通过SqlCommand.Parameters

听起来好像只有两个表——管理员和普通用户。作为一种替代方法,您可以将bool值传递给方法,如isAdmin,然后根据用户是管理员还是普通用户进行两个查询。

public static bool clsFuncLogin(string user, string pass, string conStr, bool isAdmin)
{
    ...
    var query = isAdmin
        ? "SELECT COUNT(*) FROM ADMIN_TABLE WHERE Username = @userid AND Password = @password"
        : "SELECT COUNT(*) FROM REGULAR_TABLE WHERE Username = @userid AND Password = @password";
    using (var sqlCommand = new SqlCommand(query, conn))
    {
        sqlCommand.Parameters.AddWithValue("@userid", user);
        sqlCommand.Parameters.AddWithValue("@password", pass);
        ...
        ...

使用

的主要原因
SELECT * FROM TABLE WHERE column=@column
带参数的

是为了避免为值提供正确格式的所有复杂性。如果您的应用程序用户以自由文本的形式提供值,则更为重要,因为如果您未能正确解决所有格式化问题(基本上不值得使用参数提供解决方案),则会打开SQL注入攻击的所有可能性。

我真的希望你不允许用户提供表名,它是由你自己的代码提供的,所以你可以很安全地使用

var query = String.Format("SELECT * FROM {0} WHERE column=@column", tableName);

然而,我只是建议创建两个单独的查询,而不是正确地分离关注点。