Ошибки кода в C#

#c# #winforms

#c# #winforms

Вопрос:

Каковы недостатки этого кода :

 SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.sqlExpress;Initial Catalog=Learn;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Insert Into tblUser(name,family,tel)Values('"   txtName.Text   "','"   txtFamily.Text   "','"   txtTel.Text   "')";
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
  

Комментарии:

1. Ошибки и недостатки — это не одно и то же. Этот код не выполняет то, что вы хотите? Почему вы спрашиваете о недостатках этого конкретного фрагмента кода? Нам нужно больше информации, чтобы ответить на этот вопрос.

2. Как ВЫ думаете, в чем заключаются некоторые недостатки? Я предполагаю, что у вас есть некоторые опасения, если вы это написали.

Ответ №1:

Вы имеете в виду помимо того факта, что SqlConnection не будет удален, и что SqlCommand написан таким образом, чтобы вызвать атаку SQL-инъекцией?

Соответствующий комикс XKCD:

http://xkcd.com/327/

Комментарии:

1. Придирка: соединение будет удалено, за исключением случаев, когда возникает исключение. Однако OP определенно должен заключать соединение и команду в using блоки.

2. В теге указано winforms , так что внедрение SQL-кода не является большой атакой. Если приложение WinForms может получить доступ к базе данных, пользователь уже может выполнить любой SQL, который он хочет, для базы данных.

3. @gabe Вам все еще нужно учитывать потенциал атак с использованием SQL-инъекций со стороны ваших авторизованных пользователей. Его можно злонамеренно использовать для уничтожения данных или для повышения уровня доступа и просмотра информации, к которой они не должны быть разрешены. Только потому, что это informs, не означает, что у них есть полномочия удалять таблицы из базы данных.

4. Робатикус: Я не говорю, что внедрение SQL не вызывает беспокойства; на самом деле это просто не атака. Пользователь, запускающий эту программу, уже имеет доступ к базе данных. Они могли бы открыть EXE-файл в шестнадцатеричном редакторе, скопировать строку подключения, вставить ее в свой любимый SQL Manager и иметь возможность выполнять любой SQL, который они хотят, в базе данных.

5. @Gabe — Я тебя слышу. Я думаю, мы все можем согласиться с тем, что по-прежнему важной практикой является очистка подобных входных данных, когда вы передаете их в командную строку SQL. Хотя, на самом деле, подготовка текстовой команды без материала и выполнение ее в вашей базе данных редко бывает хорошей вещью.

Ответ №2:

Одним из основных недостатков является то, что вы не заключаете свои строки в кавычки или не используете параметризованные запросы, поэтому тот, кто вводит O'Brien свою фамилию, получит исключение.

Конечно, это также означает, что кто-то может ввести произвольный SQL в текстовое поле и попросить вас выполнить его для них. Это плохо.

Ответ №3:

Связанные с безопасным кодированием….

Ваш код уязвим для атак с использованием SQL-инъекций, поскольку вы напрямую используете txtName.text в коде для формирования запроса. Следует использовать параметризованные запросы. Кроме того, вы должны проверить txtName.txt перед его использованием. Вот и все.

Комментарии:

1. Что значит «проверять txtName.txt «? Вы предполагаете, что существуют какие-то недопустимые значения?

2. Что ж.. '); DROP TABLE tblUser; -- было бы недопустимым значением — хотя это бы ничего не повредило, если бы использовались параметризованные запросы.

3. @Joel: Почему это не должно быть допустимым именем? Если Бобби было дано такое имя, пользователю должно быть разрешено вводить его в базу данных и сохранять там.