如何从C#中的数据库中获取用户名和密码?

时间:2009-02-19 14:00:46

标签: c# .net asp.net tsql sql-injection

我在btn_click事件中有以下代码:

Sqlconnection con = new Sqlconnection("server=.;database=bss;user id=ab;pwd=ab");
con.open();
SqlCommand cmd = new Sqlcommand("select * from login where username='" 
+ txt4name.Text + "' and pwd='" + txt4pwd.Text + "'", con);

SqlDataReader reader = cmd.execute Reader();

表格login的位置,usernamepwd是其字段。在此代码之后,所有值都存储在reader对象中。我想将usernamepwd存储在单独的变量中。

我该如何做到这一点?

9 个答案:

答案 0 :(得分:12)

通常,在访问数据库时,您应该使用与此类似的东西来消除SQL注入漏洞:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM USERS WHERE USERNAME=@username AND PASSWORD=HASHBYTES('SHA1', @password)", myConnection))
    {                    
        myCommand.Parameters.AddWithValue("@username", user);
        myCommand.Parameters.AddWithValue("@password", pass);

        myConnection.Open();
        SqlDataReader myReader = myCommand.ExecuteReader())
        ...................
    }

但更真实地存储凭据,您应该使用类似Membership system的内容,而不是自己滚动。

答案 1 :(得分:7)

You're running a huge risk of sql injection with that.将SQL参数用于SqlCommands中的值。

答案 2 :(得分:4)

如果您的意思是c#变量,并且如果您想从db获取它们,请执行以下操作:

SqlDataReader reader = cmd.execute Reader();
if (reader.Read())
{
    string username = reader["username"];
    string pwd = reader["password"];
}

当你在它时,参数化你的查询并阻止sql注入:

SqlCommand cmd = new Sqlcommand("select * from login where username=@username and pwd=@pwd", con);
cmd.Parameters.AddWithValue("@username", txt4name.Text);
cmd.Parameters.AddWithValue("@pwd", txt4pwd.Text);

答案 3 :(得分:2)

绝对注意有关SQL注入的建议,但这是您的问题的答案:

String username;
String pwd;

int columnIndex = reader.GetOrdinal("username");

if (!dataReader.IsDBNull(columnIndex))
{
    username = dataReader.GetString(columnIndex);
}

columnIndex = reader.GetOrdinal("pwd");

if (!dataReader.IsDBNull(columnIndex))
{
    pwd = dataReader.GetString(columnIndex);
}

答案 4 :(得分:0)

string userName =  txt4name.Text;
string password =  txt4pwd.Text;

这真的是你想要的吗?只是将数据转化为变量?

答案 5 :(得分:0)

您确实需要使用参数化SQL。 There's an example here 此外,你的问题确实没有意义;你想要单独的变量用户名和密码?他们已经在你的例子中分开了。如果您无法将它们分配给字符串,我建议您遵循一些tutorials

答案 6 :(得分:0)

另一种方法是将读者结果加载到DataTable中,如下所示:

DataTable Result = new DataTable();

Result.Load(reader);

如果您的登录表只包含两个唯一的列(userName和password),那么您最终会得到只包含一行信息的Result。然后,您可以从每列获取列值:

string userName = Result.Rows[0].Field<string>("userName");
string password = Result.Rows[0].Field<string>("pwd");

答案 7 :(得分:0)

private void but_login_Click(object sender, EventArgs e)
{
    string cn = "Data Source=.;Initial Catalog=mvrdatabase;Integrated Security=True";
    SqlConnection con = new SqlConnection(cn);
    con.Open();
    SqlCommand cmd = new SqlCommand("select count (*) from logintable where username ='" + txt_uname.Text + "'and password='" + txt_pass.Text + "'", con);
    int i = Convert.ToInt32(cmd.ExecuteScalar());
    con.Close();

    if (i == 1)
    {
        Form2 f2 = new Form2();
        MessageBox.Show("User login successfully........");
        this.Hide();
        f2.Show();
    }
    else
    {
        MessageBox.Show("INCORRECT USERID AND PASSWORD", "Error");
    }
}

答案 8 :(得分:-3)

您通常可以在MSDN上找到基本用法示例,例如this one for SqlDataReader