查询数据库的用户名和密码

时间:2013-11-12 17:34:14

标签: c# sql-server sqlcommand

我对C#完全陌生。我正在验证区分大小写的用户名和密码 来自数据库sql server 2008.这是我的登录代码;我该怎么办?

SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=db_WiBo;Integrated Security=True");

SqlCommand cmd = new SqlCommand("SELECT * from tb_Account where Username= '"+textBox1.Text+"'  AND Password= '"+textBox2.Text+"' ", conn);

conn.Open();
SqlDataReader reader = cmd.ExecuteReader()

if (reader.HasRows)
{
   reader.Close();
   this.Hide();
}

提前致谢

5 个答案:

答案 0 :(得分:4)

1)您应该使用存储过程或参数化查询而不是SQL Concatenation。您已经在代码中呈现了一个巨大的SQL Server注入安全漏洞。

你遇到的问题是什么?代码看起来很好 - 如果没有检索到记录,您确定输入是否与数据库中的数据匹配?

代码只是执行查询,如果找到,则关闭阅读器并隐藏表单。

你也不应该在数据库中存储原始密码 - 另一个安全漏洞。相反,散列它们/加密它们并根据输入中的散列/加密值检查该值。 区分大小写,您可以使用排序规则

http://technet.microsoft.com/en-us/library/ms184391.aspx

http://blog.sqlauthority.com/2007/04/30/case-sensitive-sql-query-search/

答案 1 :(得分:2)

一些事情:

  1. 你错过了';'在SqlDataReader reader = cmd.ExecuteReader()
  2. 的末尾
  3. 如前所述,使用Stored Procedure表示您正在做的事情。
  4. 如前所述,使用parameterized queries,因为您接受来自文本框的输入。
  5. 使用using statement管理您的连接和命令对象。
  6. 完成后不要忘记.Close()你的联系。
  7. 哦,我差点忘了,hash你的密码!
  8. 以上是上述示例:

    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=db_WiBo;Integrated Security=True"))
    {
       using (SqlCommand cmd = new SqlCommand(@"SELECT * from tb_Account where Username= '@username'  AND Password= '@password' ", conn))
       {
          cmd.Parameters.Add("@username", textBox1.Text);
          cmd.Parameters.Add("@password", textBox2.Text);
          conn.Open();
    
          SqlDataReader reader = cmd.ExecuteReader();
          if (reader.HasRows)
          {
             reader.Close();
             this.Hide();
          }
          conn.Close();
       }
    }
    

答案 2 :(得分:1)

除了SQL注入问题之外,您还需要使用排序规则或强制转换为二进制文件。我找到了另一个有一堆有用的东西的问题:
How to do a case sensitive search in WHERE clause (I'm using SQL Server)?

答案 3 :(得分:1)

首先:不要使用字符串连接。这可以很容易地用于代码注入。

您可以使用存储过程,或LinQ to SQL甚至使用内置成员提供者

答案 4 :(得分:1)

尽管已经针对安全性指出了设计问题,但如果SQL Server实例的默认排序规则不区分大小写,则需要选择合适的排序规则。 SQL Server安装的默认排序规则[通常,取决于服务器区域设置] SQL_Latin1_General_Cp1_CI_AS,表示Latin-1代码页,不区分大小写,区分重音。

创建数据库时,可以为该数据库指定默认排序规则。当您创建表格时,您可以指定要用于每个charvarcharncharnvarchar列的排序规则。

您也可以通过适当的DDL语句更改这些内容。请注意,更改collat​​ino可能会影响数据完整性,从而导致主键和唯一索引等内容被破坏。

创建一个表,并为其列指定排序规则很简单:

create table account
(
  id       int         not null identity(1,1) primary key clustered ,
  user_id  varchar(32) collate SQL_Latin1_General_Cp1_CS_AS not null unique ,
  password varchar(32) collate SQL_Latin1_General_Cp1_CS_AS not null unique ,
  ...
)

您也可以使用alter tablealter database来更改排序规则。

可以在http://technet.microsoft.com/en-us/library/ms180175.aspxhttp://technet.microsoft.com/en-us/library/ms188046.aspx

找到支持的排序规则

你应该

  • 请注意,在比较2列和
  • 时,混合归类可能会导致问题
  • 注意别人提出的安全问题。