我对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();
}
提前致谢
答案 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)
一些事情:
SqlDataReader reader = cmd.ExecuteReader()
。.Close()
你的联系。以上是上述示例:
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代码页,不区分大小写,区分重音。
创建数据库时,可以为该数据库指定默认排序规则。当您创建表格时,您可以指定要用于每个char
,varchar
,nchar
或nvarchar
列的排序规则。
您也可以通过适当的DDL语句更改这些内容。请注意,更改collatino可能会影响数据完整性,从而导致主键和唯一索引等内容被破坏。
创建一个表,并为其列指定排序规则很简单:
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 table
和alter database
来更改排序规则。
可以在http://technet.microsoft.com/en-us/library/ms180175.aspx和http://technet.microsoft.com/en-us/library/ms188046.aspx
找到支持的排序规则你应该