el_tot93 Ответов: 4

Каков хороший способ написать это на C#?


string query2 = "select * from [next] where id='" + txtCIVILIDD.Text + "'";
            SqlCommand command = new SqlCommand(query2, con);
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            con.Open();
            command = new SqlCommand("INSERT INTO next (id,time,clock,username,Name_Arabic,gender) VALUES('" + txtCIVILIDD.Text + "','" + txttime.Text + "','" + txtclock.Text + "','" + txtusername.Text + "','" + txtName_Arabic.Text + "','" + CBgender.Text + "')", con);
            command.ExecuteNonQuery();
            con.Close();


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

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

я не знаю хорошего способа для этого я знаю что у меня есть sql инъекция

4 Ответов

Рейтинг:
35

Pete O'Hanlon

На первый взгляд, в вашем коде есть несколько проблем. Во-первых, ваш код широко открыт для чего-то, известного как атака Sql - инъекций. Этот[^] статья объясняет, что это такое и как вы можете их предотвратить.

Во-вторых, у вас есть код, который вы не можете гарантировать, что вызовет Dispose, когда вы закончите с ресурсами. Это означает, что ресурсы могут не высвобождаться, что может привести к утечкам памяти или истощению ресурсов (что означает, что ресурс, на который вы полагаетесь, например подключение к базе данных, может быть недоступен для вас, потому что вы использовали их все). Наиболее распространенным способом решения этой проблемы является использование using оператор для обертывания объектов, реализующих IDisposable Что-то вроде этого:

using (SqlConnection con = new SqlConnection(myConnectionString))
{
  // Do my work
} // When the application reaches this point, it will automatically call con.Dispose()


CPallini

5.

Pete O'Hanlon

Спасибо

Рейтинг:
2

Patrice T

command = new SqlCommand("INSERT INTO next (id,time,clock,username,Name_Arabic,gender) VALUES('" + txtCIVILIDD.Text + "','" + txttime.Text + "','" + txtclock.Text + "','" + txtusername.Text + "','" + txtName_Arabic.Text + "','" + CBgender.Text + "')", con);

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


MadMyche

5'd. и плакат получил эту же информацию уже несколько раз

Patrice T

Спасибо.

Рейтинг:
13

Richard Deeming

Как уже указывали другие, ваш код уязвим для SQL-инъекций. Но ты уже знал это! :)

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

using (SqlConnection con = new SqlConnection(myConnectionString))
{
    con.Open();
    
    // INSERT command:
    using (SqlCommand command = new SqlCommand("INSERT INTO [next] (id, time, clock, username, Name_Arabic, gender) VALUES (@id, @time, @clock, @username, @Name_Arabic, @gender)", con))
    {
        // TODO: Convert the text to an appropriate type, if necessary:
        command.Parameters.AddWithValue("@id", txtCIVILIDD.Text);
        command.Parameters.AddWithValue("@time", txttime.Text);
        command.Parameters.AddWithValue("@clock", txtclock.Text);
        command.Parameters.AddWithValue("@username", txtusername.Text);
        command.Parameters.AddWithValue("@Name_Arabic", txtName_Arabic.Text);
        command.Parameters.AddWithValue("@gender", CBgender.Text);
        
        command.ExecuteNonQuery();
    }
    
    // SELECT command:
    using (SqlCommand command = new SqlCommand("SELECT * FROM [next] WHERE id = @id", con))
    {
        // TODO: As above, convert the text to an appropriate type if necessary:
        command.Parameters.AddWithValue("@id", txtCIVILIDD.Text);
        
        SqlDataAdapter adapter = new SqlDataAdapter(command);
        DataSet data = new DataSet();
        adapter.Fill(data);
        
        // TODO: Do something with the loaded data here...
    }
}

NB: Как указано в комментариях, вы можете столкнуться с проблемами, если текст в ваших элементах управления не может быть преобразован в соответствующие типы для столбцов. При необходимости вам нужно будет проверить текст и/или преобразовать его в соответствующий тип перед добавлением параметров.

Немного легкого чтения для вас:
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


CPallini

5.

MadMyche

+5 Однако может возникнуть проблема, если некоторые из этих полей не являются текстовыми

Richard Deeming

Может быть. Но поскольку мы не знаем типов столбцов, мы мало что можем сделать. :)

MadMyche

Вы, конечно, правы, но когда это будет скопировано/вставлено; плакат может прочитать комментарии и соответствующим образом скорректировать их. Или попросите нас настроить его

Рейтинг:
0

Ammar_Ahmad

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


Richard MacCutchan

Нет, правильный способ-использовать параметризованные запросы, как объяснил Пит выше.

MadMyche

+1