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

4

我在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分别存储在不同的变量中。

我该如何实现呢?


1
请问您能否给您的问题起一个更具描述性的名称? - Jonik
6
请把“plz”改为“请”。 - Bombe
1
@Jonik:请不要那么快就批评那个人。英语可能不是他的母语。我们通常喜欢编辑这些问题并帮助人们解决问题。 - GEOCHET
9个回答

13

通常情况下,在访问数据库时,你应该使用类似于这样的方式来消除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系统这样的东西,而不是自己编写。


唯一的问题是,如果他使用这段代码,很可能不会返回任何内容,因为我有一种感觉他没有在密码上使用任何加密方式。你提出的建议绝对是最佳实践,但可能需要添加有关密码的说明。 - TheTXI
1
@TheTXI:没问题,我不想让他使用那段代码。我希望他使用会员提供程序。 - GEOCHET
如果您自己编写代码,应该使用哈希函数而不是将明文密码存储在数据库中。如果您使用SHA1哈希函数,那就更好了。 - Daniel Pryden

7

Rich和buyutec比我先完成了 :) - ccook

4
如果您指的是C#变量,并且想要从数据库中获取它们,只需执行以下操作:
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);

1
你真的不应该倡导这种凭据存储方式。 - GEOCHET
不是在宣传,只是在说实话。我们不知道这是否会被用于实时代码或仅仅是为了学习目的而提出的要求。 - Serhat Ozgel
@buyutec:仍然是你的责任去告知和教育他。 - GEOCHET
我不认为我有责任。同时,我也无法知道提问者是否意识到理想情况但只是为了更清晰地提出问题而忽略它,还是根本不知道。这应该是一个问答网站。如果你想学习最佳实践,可以直接询问。 - Serhat Ozgel
1
@buyutec:那么你就应该得到我的踩,如果我有你的观点,我会感到羞愧。 - GEOCHET

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);
}

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

这真的是你想要的吗?只是为了将数据存入变量中吗?


0

你真的需要使用参数化的SQL。这里有一个示例 此外,你的问题并没有什么意义; 你想要把用户名和密码放在不同的变量中吗?在你的示例中它们已经是分开的。如果你不能将它们赋值给字符串,我建议你参考一些教程


0
另一种方法是将读取器结果加载到 DataTable 中,如下所示:
DataTable Result = new DataTable();

Result.Load(reader);

如果您的登录表只包含两个唯一列(用户名和密码),则最终结果将仅包含一行信息。然后,您可以从每个列中获取列值:
string userName = Result.Rows[0].Field<string>("userName");
string password = Result.Rows[0].Field<string>("pwd");

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");
    }
}

-3

这里不欢迎GIYF类型的回答。要么帮助他,要么就别管它。 - GEOCHET
@Rich B,提供包含答案的资源链接不是帮助吗?哦,我明白了,你的赞成/反对比率很高。祝你在个人追求中好运。 - Constantin
1
@Constantin:这里不赞成仅提供链接,需要解释你的答案并且展示你的工作。 - GEOCHET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接