saimanisha Ответов: 3

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


его принятие, если имя пользователя-Sai и SAi ..его лечение одинаково для обоих имен пользователей
тот же сценарий происходит и с паролем
если пароль SAI1@
sai1@
его трактуют как одно и то же

Что я уже пробовал:

SqlCommand cmd = new SqlCommand("SELECT * FROM VEL_EXISTING_USERDTLS  WHERE USER_NAME = '" + textBox1.Text + "' AND PASSWORD = '" + textBox2.Text + " '", con);

                   cmd.Parameters.AddWithValue("@USER_NAME", textBox1.Text);
                   cmd.Parameters.AddWithValue("@PASSWORD", textBox2.Text);
                   SqlDataReader dr = cmd.ExecuteReader();
                   if (dr.Read())
                   {
                       this.Hide();
                       Form4 f = new Form4();
                       f.Show();
                   }
                   else
                   {
                       MessageBox.Show("invalid login");
                   }
               }
               else
               {
                   MessageBox.Show("USERNAME COULD NOT BE EMPTY");
               }

           }

Richard MacCutchan

Все в этом SQL-операторе неверно. Конкатенация строк и хранение паролей в открытом тексте.

3 Ответов

Рейтинг:
2

Nirav Prabtani

Вам нужно добавить

COLLATE Latin1_General_CS_AS 
в запросе

попробовать это

SqlCommand cmd = new SqlCommand("SELECT * FROM VEL_EXISTING_USERDTLS  WHERE USER_NAME = '" + textBox1.Text + "' COLLATE Latin1_General_CS_AS  AND PASSWORD = '" + textBox2.Text + " '" COLLATE Latin1_General_CS_AS , con);


для дополнительной информации

Параметры Сортировки | Microsoft Docs[^]

SQL-сервер - сортировка - регистр SQL-запрос поиска - Путешествие в SQL орган пинал Дэйв[^]

Примечание: вместо конкатенации строки используйте параметризованный запрос или хранимую процедуру для предотвращения SQL-инъекции


Дайте нам знать, если у вас есть какие-либо вопросы или опасения по этому поводу


Рейтинг:
1

Wessel Beulink

Зачем вам проверять пароли в базе данных, если они существуют? Это не "ключевое" значение. Если это так, то у вас есть ошибка в вашей базе данных.

Имя пользователя-это единственное, что вы можете проверить, если оно существует. Я бы посоветовал вам не проверять ни то, ни другое.

 SqlCommand cmd = new SqlCommand($"SELECT * FROM VEL_EXISTING_USERDTLS WHERE USER_NAME = '{textBox1.Text}'")
SqlDataReader dr = cmd.ExecuteReader(); 

if(dr.HasRows)
{
  //in use.
}


Рейтинг:
0

Suvendu Shekhar Giri

Если вы используете SQL Server, то параметры сортировки могут помочь в этом отношении.
Попробуйте что-нибудь вроде-

SqlCommand cmd = new SqlCommand("SELECT * FROM VEL_EXISTING_USERDTLS  WHERE USER_NAME = '" + textBox1.Text + "' COLLATE SQL_Latin1_General_CP1_CS_AS AND PASSWORD = '" + textBox2.Text + "' COLLATE SQL_Latin1_General_CP1_CS_AS", con);


Для дальнейшего чтения проверьте следующую ссылку-
Параметры Сортировки | Microsoft Docs[^]

ВАЖНЫЙ:
Ваш запрос уязвим для SQL-инъекций. Это очень важно знать и предотвращать.
Чтобы избежать этого, можно использовать либо параметризованный запрос, либо хранимую процедуру.
Пожалуйста, проверьте следующие ссылки для получения дополнительной информации-
Атаки SQL-инъекций и некоторые советы о том, как их предотвратить[^]
Атака SQL-инъекций, ее примеры и механизмы предотвращения и методы в ASP.Net[^]

Надеюсь, это поможет :)


ZurdoDev

За исключением того, что не объединяйте пользовательский ввод в свой sql-запрос. Вместо этого используйте параметры.

Suvendu Shekhar Giri

Спасибо, что указал на него. Я действительно согласен с вами.
( мне не повезло, что я получил отрицательный голос.. ваш комментарий пришел в то же самое время, когда я добавлял эту информацию к своему ответу.

Во всяком случае, я люблю видеть всех, кто обеспокоен такими критическими проблемами, как SQL-инъекция и все такое.

Спасибо :)