C#中用于简单登录的参数化查询[重复]
Posted
技术标签:
【中文标题】C#中用于简单登录的参数化查询[重复]【英文标题】:Parameterised QUERY in C# for simple login [duplicate] 【发布时间】:2018-12-06 21:54:37 【问题描述】:我一直在使用 ASP 做简单的网站,但不知道如何添加参数化查询以避免任何 SQL 注入攻击,谁能帮我做这件事我总是遇到错误,而且已经做了一个多星期了我还是想不通。下面我附上了我的简单代码。
protected void btnLogin_Click(object sender, EventArgs e)
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
string sql = "Select * From Users Where UserID='" + txtUser.Text + "' And Password='" + txtPwd.Text + "'";
con.Open();//opens the connection
//create the command object
cmd = new SqlCommand(sql, con);
//assigns the result to the reader
dr = cmd.ExecuteReader();
dr.Read();//read the record's data
//if there's a matching record found
if (dr.HasRows)
if (dr["UserType"].Equals("admin"))
Response.Redirect("dhome.aspx");
else if (dr["UserType"].Equals("staff"))
Response.Redirect("shome.aspx");
else if (dr["UserType"].Equals("member"))
Response.Redirect("mhome.aspx");
else
lblAlert.Text = "Invalid username or password!";
dr.Close(); //close the data reader
con.Close();//close the connection //declaration of data access components
【问题讨论】:
发布您尝试过的代码并指出您遇到的错误 另请注意,将密码存储在数据库中是一个非常糟糕的主意。您应该存储哈希 您尝试使用什么示例代码?这很容易研究。 你应该检查 dr.HasRows 之前你试图阅读读者。 【参考方案1】:你应该使用SqlCommand.Parameters.Add()
添加它们:
using (SqlConnection con = new SqlConnection(ConnectionString))
SqlCommand cmd = new SqlCommand("Select * From Users Where UserID=@username And Password=@password", con);
cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = password;
//rest of the code ...
【讨论】:
【参考方案2】:您需要使用SqlCommand.Parameters.Add
。您还应该实现 dispose(通过使用块或调用Dispose
)以在使用后释放资源:
string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string sql = "Select * From Users Where UserID=@user And Password=@pwd";
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(sql, connection))
command.Parameters.Add("@user", SqlDbType.VarChar);
command.Parameters["@user"].Value = "value";
command.Parameters.Add("@pwd", SqlDbType.VarChar);
command.Parameters["@pwd"].Value = "value";
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
if (reader.HasRows)
// read row
【讨论】:
AddWithValue
应避免使用Add(string, dbType)
为什么要避免AddWithValue
?
请stop using AddWithValue
;它必须猜测数据类型,有时它会猜错。
我已更新我的答案以反映反馈。
@MawadaRahm 我不知道你为什么要为这个答案责备我——我与此无关。我刚刚就它遇到的一些问题向作者发表了评论。您可能想阅读 What is a NullReferenceException, and how do I fix it?,因为这是一个全新的不同问题。以上是关于C#中用于简单登录的参数化查询[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 参数化查询的功能就像它在 C# 应用程序中未参数化一样