Member 14201773 Ответов: 3

Как проверить повторяющиеся значения и куда добавить код


 SqlConnection con = new SqlConnection("Data source=SABITARAI-PC\\SQLEXPRESS; Initial Catalog=SRMAMSDB; user id=abc; password=sabita23");
            string str, str2;
            str = "select *from tblUserRegistrationForm where User_Name='" + txtUserName.Text + "'and Password='" + txtPass.Text + "'";
            SqlCommand cmd = new SqlCommand(str, con);
            SqlDataReader sdr;
            con.Open();
            sdr = cmd.ExecuteReader();
           
            if (sdr.Read())
            {
                MessageBox.Show(" User already exists");
            }
            
            else
            {
                sdr.Close();
                str2 = "insert into tblUserRegistrationForm (User_name,Password,UserRole)values( '" + txtUserName.Text + "','" + txtPass.Text + "', '" + cmbUserRole.SelectedItem.ToString() + "')";
                SqlCommand cmd2 = new SqlCommand(str2, con);
                cmd2.ExecuteReader();
                txtUserName.Text = "";
                txtPass.Text = "";
                cmbUserRole.Text = "";
                txtUserName.Focus();
            }
           

            con.Close();
        }

        this is my code

What I have tried:

<pre>SqlDataAdapter sda = new SqlDataAdapter(cmd.CommandText, con);
            DataTable dt = new DataTable();
            sda.Fill(dt);

BillWoodruff

что же теперь не так ? есть ли сообщение об ошибке Энн ?

3 Ответов

Рейтинг:
0

Richard MacCutchan

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


Рейтинг:
0

Patrice T

str = "select *from tblUserRegistrationForm where User_Name='" + txtUserName.Text + "'and Password='" + txtPass.Text + "'";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
0

MadMyche

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

Снижение уязвимости: чтобы уменьшить вероятность атак с использованием SQL-инъекций, я бы рекомендовал параметризация из всех твоих команд. Вот краткий пример, основанный на строках 3 и 4 вашего кода (вам также нужно будет сделать то же самое с оператором UPDATE)

str = "select * from tblUserRegistrationForm where User_Name=@UserName and Password=@Password";
SqlCommand cmd = new SqlCommand(str, con);
cmd.Paramaters.AddWithValue("@UserName", txtUserName.Text);
cmd.Paramaters.AddWithValue("@Password", txtPass.Text);

Укрепление безопасности: вы должны никогда храните пароли в виде обычного текста. Вы должны реализовать какой-то метод хэширование их защищать. Однако это потребует гораздо большего, чем быстрый ответ. Я бы рекомендовал прочитать статьи здесь и в других местах по этой теме. Я работал с реализациями bCrypt и тоже счел бы это приемлемым.
Хранение паролей: как это сделать.[^]
Используйте BCrypt для хэширования ваших паролей: пример для C# и SQL Server « блог разработки программного обеспечения Роба крафта[^]


"Контрольная" часть неэффективна. Зачем выбирать все, если пользователь существует? Наиболее эффективным методом было бы использовать EXISTS Если этот оператор возвращает 1, то пользователь существует, если 0, то пользователь не существует
IF EXISTS(SELECT 1 FROM tblUserRegistrationForm WHERE User_name = @UserName) BEGIN
  SELECT 1
END; ELSE BEGIN
  SELECT 0
END
Обратите внимание, что я не включил пароль Не потому, что он небезопасен, а потому, что он просто не нужен, так как нам нужно только проверить, существует ли пользователь (определяется именем пользователя), а не аутентификация (которая потребует пароля).