mysql_real_escape_string() в .NET Framework

#php #.net #mysql #sql-server #escaping

#php #.net #mysql #sql-сервер #экранирование

Вопрос:

я хочу найти функцию в .NET framework, которая вызывает библиотеку SQL-Сервера для экранирования действительно значения для отправки на sql server, как mysql-real-escape-string() вызывает библиотеку MySQL для выполнения в PHP.
пожалуйста, предложите метод, который я могу вызвать, и он вернет экранированную строку с помощью одного обратного перехода к базе данных, нет необходимости выполнять его запрос
Есть ли он?

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

1. Кстати: mysql_real_escape_string никак не взаимодействует с базой данных. Также: предложенное решение от @Thomas прекрасно, точно так же, как подготовленные инструкции также являются способом перехода в php

2. @edorian — mysql_real_escape_string() фактически взаимодействует с базой данных: это сервер, который выполняет работу, и он не будет работать без подключения к БД.

3. @Alvaro: Требуется подключение для определения набора символов, который будет использоваться для экранирования содержимого. Но никакого обхода туда и обратно не происходит. Все экранирование выполняется на стороне клиента. Не верите мне? Запустите wireshark и понаблюдайте за взаимодействием между PHP и MySQL. Клиент выполняет экранирование (что также является единственным, что имеет смысл)…

4. @ircmaxell — Я только что протестировал, и вы абсолютно правы. Я неправильно понял mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string часть в документации. Очевидно, что это относится к клиентской библиотеке.

5. @ahoo: подготовленные инструкции (или более точно параметризованные запросы) являются лучшим вариантом во всех отношениях. Вы можете полагаться на экранирование на стороне клиента, только если вы правильно задали набор символов и используете его должным образом. Как и любой инструмент, он хорош настолько, насколько он используется…

Ответ №1:

Почему вы хотите это сделать? Правильный способ отправки пользовательского ввода в базу данных — не экранировать его, а использовать параметры запроса.

 using(var command = new SqlCommand("insert into MyTable(X, Y) values(@x, @y)", connection))
{
    command.Parameters.Add("@x", textBoxX.Text);
    command.Parameters.Add("@y", textBoxY.Text);
    command.ExecuteNonQuery();
}
  

Это обеспечивает лучшую производительность, поскольку текст запроса всегда один и тот же, поэтому план выполнения запроса может быть кэширован. Это также защищает вас от атак с использованием SQL-инъекций. И это также позволяет вам игнорировать проблемы с форматированием данных (например, как форматируется DateTime в SQL-Server? Как вы должны представлять число в SQL? и так далее)

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

1. да, я хорошо подумал об этом. но в параметрическом способе есть проблема: количество параметров исправлено, но я хочу динамически создавать sql с количеством параметров, зависящих от введенных пользователем значений.

2. @ahoo, количество параметров не фиксировано, ничто не мешает вам динамически добавлять параметры в цикле… Конечно, в этом случае вы не получаете преимущества в производительности, но это все равно лучше, чем жестко кодировать значения в SQL-запросе.

3. спасибо @Thomas, так что это похоже на «Подготовленную инструкцию» в PHP (с использованием функций: mysqli_stmt_prepare(),mysqli_stmt_bind_param()). правильно ли это?

4. @ahoo, да, это примерно то же самое. Кстати, вы можете явно Prepare() использовать команду и в .NET, если собираетесь использовать ее несколько раз с разными значениями параметров