繁体   English   中英

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

[英]Querying a database for username and password

我是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();
}

提前致谢

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

你有什么问题? 代码看起来不错-如果没有要检索的记录,您确定输入与数据库中的数据匹配吗?

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

您也不应将原始密码存储在数据库中-另一个安全漏洞。 而是对它们进行散列/加密,然后对照输入中的散列/加密值检查该值。 为了区分大小写,您可以使用归类

http://technet.microsoft.com/zh-CN/library/ms184391.aspx

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

一些东西:

  1. 您缺少“;” SqlDataReader reader = cmd.ExecuteReader()的末尾。
  2. 如前所述,对您正在执行的操作使用存储过程
  3. 如前所述,请使用参数化查询,因为您正在接受来自文本框的输入。
  4. 使用using语句来管理您的连接和命令对象。
  5. 完成后不要忘记.Close()连接。
  6. 哦,我差点忘了,对您的密码进行哈希处理

这是上述示例:

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

除了SQL注入问题外,您还需要使用排序规则或强制转换为二进制。 我发现了另一个SO问题,它有很多有用的东西:
如何在WHERE子句中进行区分大小写的搜索(我正在使用SQL Server)?

首先:请勿为此使用字符串concat。 这可以轻松地用于代码注入。

您可以改用存储过程,也可以改用LinQ to SQL,甚至可以使用内置的MembershipProvider

尽管已经指出了有关安全性的设计问题,但是,如果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/zh-cn/library/ms180175.aspxhttp://technet.microsoft.com/zh-cn/library/ms188046.aspx中找到支持的归类

你应该

  • 请注意,在比较2列时,混合排序规则可能会导致问题,并且
  • 注意其他人提出的安全问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM