Преимущества использования параметров вместо конкатенации - PullRequest
3 голосов
/ 07 декабря 2011

Я новичок в программировании на ASP.NET и C #.

Я хотел бы знать, в чем разница и преимущества плюс недостатки использования параметров вместо конкатенации в операторах SQL, поскольку я слышал, что это лучший способ предотвратить внедрение SQL (?)

Ниже приведены примеры операторов INSERT, которые я изменил с использования конкатенации на параметры:

Конкатенация:

string sql = string.Format("INSERT INTO [UserData] (Username, Password, ...) VALUES ('" + usernameTB.Text + "', '" + pwTB.Text + "',...);

Параметры:

cmd.CommandText = "INSERT INTO [UserData] (Username, Password, ...) VALUES (@Username, @Password, ...)";

cmd.Parameters.AddWithValue("Username", usernameTB.Text);
cmd.Parameters.AddWithValue("Password", pwTB.Text);

Заранее благодарим за предоставленные знания.

Ответы [ 3 ]

8 голосов
/ 07 декабря 2011
  • Безопасность. Конкатенация открывает вам доступ к SQL-инъекциям, особенно когда TB обозначает Textbox. (Обязательный мультфильм XKCD )
  • Тип безопасности. Вы решаете множество проблем DateTime и форматирования чисел.
  • Speed. Запрос не меняется все время, система (-ы) могут повторно использовать дескриптор запроса.
3 голосов
/ 07 декабря 2011

Преимущества

Уклонение от SQL-инъекций является основным.Это обеспечивает полное разделение предоставленных пользователем данных и исполняемого кода.

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

Использование, например, параметров datetime позволяет избежать проблем с неоднозначными форматами дат в строковых представлениях.

Если для SQL Server это означает лучшее использование кэша плана.Вместо того, чтобы скомпилировать и сохранить множество похожих запросов adhoc, он просто использует повторно.

Недостатки

Нет:

Вы можете иногда встречатьсяпроблемы с перехватом параметров из-за неправильного повторного использования плана, но это не означает, что в этом случае не следует использовать параметризованные запросы.В SQL Server вы обычно добавляете подсказку к запросу RECOMPILE или OPTIMIZE FOR, чтобы избежать этой проблемы.

2 голосов
/ 07 декабря 2011

Одна очень веская причина - предотвратить внедрение SQL.

Представьте, что ваш usernameTB.Text равен:

"'some  text', 'password') GO; DROP TABLE [USER DATA] GO;"

Если вы используете параметр, эта строка будет экранирована правильно (например, «заменена на»), поэтому она станет значением поля.

...