我尝试检查用户是否存在。我尝试:
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");
我的表结构是
无法找到我的错误。谢谢。
答案 0 :(得分:6)
您没有引用这些值,因此您的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可能会出现在您的街道上。 (我有一份副本,但我承认还没读过多少 - 我听过巴里谈论安全问题,而且他非常清楚地解释了这一点。)
答案 1 :(得分:1)
我认为将字符串值 injection 全部放入最终的SQL query
。
不要使用简单字符串连接,而是使用SqlParameter将值注入查询中,并且很可能会解决您的问题。
答案 2 :(得分:0)
你必须逃避你的参数,
此外,您不应该使用这样的直接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 :(得分:0)
cmd.CommandText = "select count(UserName) from " + tblName + " where Password='" + Password + "' and usertype='" + Usertype + "' and username='"+ UserName + "'";
试试这个,我想你的问题是'。