0

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

提前致谢

4

5 回答 5

4

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

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

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

你也不应该在数据库中存储原始密码——另一个安全漏洞。相反,对它们进行散列/加密,并根据输入中的散列/加密值检查该值。为了区分大小写,您可以使用 Collat​​ion

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

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

于 2013-11-12T17:36:15.057 回答
2

一些东西:

  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();
   }
}
于 2013-11-12T17:53:56.773 回答
1

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

于 2013-11-12T17:37:42.493 回答
1

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

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

于 2013-11-12T17:37:54.143 回答
1

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

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

您也可以通过适当的 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 tableandalter database来更改排序规则。

可以在http://technet.microsoft.com/en-us/library/ms180175.aspxhttp://technet.microsoft.com/en-us/library/ms188046.aspx找到支持的排序规则

你应该

  • 请注意,在比较 2 列时,混合排序规则可能会导致问题,并且
  • 注意其他人提出的安全问题。
于 2013-11-12T17:53:46.237 回答