使用参数.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;
但我被告知这是不好的做法。任何建议吗?
我从未见过表名作为参数传递,并且基于其他帖子(例如这个和这个),我认为它不容易做到…至少,不通过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);
然而,我只是建议创建两个单独的查询,而不是正确地分离关注点。