我一直在尝试执行登录查询。我认为这个函数的主要问题是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;
但我被告知这是不好的做法。有什么建议吗?
答案 0 :(得分:2)
我从未见过将表名作为参数传递,并且基于其他帖子(例如this和this),我认为不能轻易完成......至少,不是通过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);
...
...
答案 1 :(得分:-1)
使用的主要原因
SELECT * FROM TABLE WHERE column=@column
带参数的是为了避免为值提供正确格式的所有复杂性。更重要的是,如果您的应用程序的用户以自由文本的形式提供值,那么如果您无法正确解决所有格式问题(基本上不值得为参数提供解决方案的努力),您将打开SQL注入攻击的所有可能性。
我真的希望您不允许用户提供您自己的代码提供的表名,这样您就可以安全地使用
var query = String.Format("SELECT * FROM {0} WHERE column=@column", tableName);
但是,我建议创建两个单独的查询,而不是正确地分离问题。