Как я создаю параметризованный SQL-запрос? Почему Должен я?

Как утверждает браузер MS .NET API, «System.Net.Mail.SmtpClient теперь является устаревшим API». «SmtpClient и его сеть типов плохо спроектированы, мы настоятельно рекомендуем использовать https://github.com/jstedfast/MailKit и https://github.com/jstedfast/MimeKit [111 ] вместо "

Вы можете попробовать это.

92
задан Visual Vincent 6 July 2017 в 12:55
поделиться

5 ответов

Ваш ИСПОЛНИТЕЛЬНЫЙ пример НЕ был бы параметризован. Вам нужны параметризированные запросы (подготовленные операторы в некоторых кругах) для предотвращения входа как это от принесения убытков:

'; панель DROP TABLE; -

Попытка, помещая это в Вашу fuz переменную (или не делают, если Вы оцениваете свой барный стол). Более тонкие и разрушительные запросы возможны также.

Вот пример того, как Вы делаете параметры с SQL-сервером:

Public Function GetBarFooByBaz(ByVal Baz As String) As String
    Dim sql As String = "SELECT foo FROM bar WHERE baz= @Baz"

    Using cn As New SqlConnection("Your connection string here"), _
        cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
        Return cmd.ExecuteScalar().ToString()
    End Using
End Function

Хранимым процедурам иногда приписывают предотвращение Внедрения SQL. Однако большую часть времени все еще необходимо назвать их использующий параметры запроса, или они не помогают. Если Вы используете хранимые процедуры исключительно , то можно выключить полномочия для ВЫБОРА, ОБНОВИТЬ, ИЗМЕНИТЬ, СОЗДАТЬ, УДАЛИТЬ, и т.д. (примерно все, но ДОЛЖНОСТНОЕ ЛИЦО) для пользователя приложения считают и получают некоторую защиту тот путь.

75
ответ дан Visual Vincent 24 November 2019 в 06:34
поделиться

Определенно последний, т.е.

Или я должен сделать что-то более обширное...? (Да, cmd.Parameters.Add())

Параметрические запросы имеют два основных преимущества:

  • безопасность: Это - хороший способ избежать Внедрение SQL уязвимости
  • Производительность: при регулярном вызове того же запроса только с различными параметрами, параметрический запрос мог бы позволить базе данных кэшировать запросы, который является значительным источником увеличения производительности.
  • Дополнительный: Вы не должны будете волноваться о проблемах форматирования даты и времени в Вашем коде базы данных. Точно так же, если Ваш код будет когда-либо работать на машинах с неанглийской локалью, у Вас не будет проблем с десятичными точками / десятичные запятые.
15
ответ дан StuartLC 24 November 2019 в 06:34
поделиться

Вы хотите пойти со своим последним примером, поскольку это - единственное, которое действительно параметризовано. Помимо проблем безопасности (которые намного более распространены затем, Вы могли бы думать) лучше позволять ADO.NET обработать параметризацию, поскольку Вы не можете быть уверены, требует ли значение, в котором Вы являетесь передающими, одинарных кавычек вокруг этого или не осматривая Type из каждого параметра.

[Редактирование] Здесь пример:

SqlCommand command = new SqlCommand(
    "select foo from bar where baz = @baz",
    yourSqlConnection
);

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@baz";
parameter.Value = "xyz";

command.Parameters.Add(parameter);
5
ответ дан Andrew Hare 24 November 2019 в 06:34
поделиться

Большинство людей сделало бы это через серверную библиотеку языка программирования, как PDO или Perl PHP DBI.

, Например, в PDO:

$dbh=pdo_connect(); //you need a connection function, returns a pdo db connection

$sql='insert into squip values(null,?,?)';

$statement=$dbh->prepare($sql);

$data=array('my user supplied data','more stuff');

$statement->execute($data);

if($statement->rowCount()==1){/*it worked*/}

Это заботится о выходе из Ваших данных для вставки базы данных.

Одно преимущество состоит в том, что можно много раз повторять вставку с одним подготовленным оператором, получая преимущество скорости.

, Например, в вышеупомянутом запросе я мог подготовить оператор однажды, и затем цикл по созданию массива данных от набора данных и повториться->, выполняются как много раз по мере необходимости.

2
ответ дан zendar 24 November 2019 в 06:34
поделиться

Ваша потребность текста команды быть похожими:

cmdText = "SELECT foo FROM bar WHERE baz = ?"

cmdText = "EXEC foo_from_baz ?"

Затем добавляют значения параметров. Этот путь гарантирует, чтобы значение подставило, только заканчивают тем, что использовались в качестве значения, тогда как с другим методом, если переменная fuz набор к

"x'; delete from foo where 'a' = 'a"

, можно видеть то, что могло бы произойти?

1
ответ дан Tony Andrews 24 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: