#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:
Комментарии:
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: Почему это не должно быть допустимым именем? Если Бобби было дано такое имя, пользователю должно быть разрешено вводить его в базу данных и сохранять там.