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# 应用程序中未参数化一样

jmeter的几种参数化方式

如何在 C# 中创建动态参数化 SQL 查询字符串

C# 中是否支持 Like 和 ln 条件的参数化查询 ?

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)