Запрос имени пользователя и пароля в базе данных

Я новичок в 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();
}

заранее спасибо


person MarckxMan    schedule 12.11.2013    source источник


Ответы (5)


1) вместо конкатенации SQL следует использовать хранимые процедуры или параметризованный запрос. вы уже представляете в своем коде огромную брешь в безопасности внедрения SQL Server.

в чем проблема? код выглядит нормально - уверены ли вы, что входные данные соответствуют данным в базе данных, если не извлекаются записи?

код просто выполняет запрос и, если он найден, закрывает средство чтения и скрывает форму.

вы также не должны хранить сырые пароли в БД - еще один недостаток безопасности. вместо этого, хешируйте их / зашифруйте их и сравните это значение с хешированным / зашифрованным значением из входных данных. для чувствительности к регистру вы можете использовать Collation

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

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

person Ahmed ilyas    schedule 12.11.2013

Несколько вещей:

  1. Вам не хватает символа ';' в конце SqlDataReader reader = cmd.ExecuteReader().
  2. Как уже упоминалось, используйте хранимую процедуру за то, что вы делаете.
  3. Как также упоминалось, используйте параметризованные запросы, поскольку вы принимаете ввод из текстовых полей.
  4. Для управления своими объекты связи и управления.
  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();
   }
}
person Brian    schedule 12.11.2013

Помимо проблем с SQL-инъекциями, вам необходимо использовать сопоставление или преобразование в двоичный. Я нашел еще один вопрос SO, в котором есть несколько полезных вещей:
Как выполнить поиск с учетом регистра в предложении WHERE (я использую SQL Server)?

person Bill Sambrone    schedule 12.11.2013

Прежде всего: не используйте для этого строковую конкатенацию. Это легко можно использовать для внедрения кода.

Вместо этого вы можете использовать хранимые процедуры или LinQ to SQL или даже использовать встроенный membershipprovider

person Ole Albers    schedule 12.11.2013

Несмотря на уже отмеченные проблемы проектирования в отношении безопасности, если параметры сортировки по умолчанию для вашего экземпляра SQL Server нечувствительны к регистру, вам необходимо выбрать подходящие параметры сортировки. Параметры сортировки по умолчанию для установки SQL Server [обычно, в зависимости от языкового стандарта сервера] SQL_Latin1_General_Cp1_CI_AS, что означает кодовую страницу Latin-1, без учета регистра и с учетом диакритических знаков.

При создании базы данных вы можете указать параметры сортировки по умолчанию для этой базы данных. И когда вы создаете таблицу, вы можете указать сопоставление, которое будет использоваться для каждого столбца char, varchar, nchar или nvarchar.

Вы также можете изменить их с помощью соответствующих операторов DDL. Обратите внимание, что изменение сопоставления может повлиять на целостность данных, что приведет к нарушению таких вещей, как первичные ключи и уникальные индексы.

Создать таблицу с указанием параметров сортировки для ее столбцов очень просто:

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

Вам следует

  • Обратите внимание, что смешанные сопоставления могут вызвать проблемы при сравнении двух столбцов и
  • Обратите внимание на проблемы безопасности, поднятые другими.
person Nicholas Carey    schedule 12.11.2013