Member 10017141 Ответов: 3

String.format для SQL-запроса на языке Си#


Всем привет,
может ли кто-нибудь дать мне совет, как написать запрос, содержащий join с помощью string.Формат.Я хочу определить формат моего предварительного запроса sql как поле только для чтения.

Вот этот запрос:

Select distinct sysI.rows AS Result , sysTab.NAME FROM sysindexes sysI
JOIN sys.Tables sysTab
ON sysI.ID = sysTab.OBJECT_ID
Where sysI.ID =  OBJECT_ID('TableName') AND sysI.indid < 2;


Что я уже пробовал:

Я попробовал написать формат как поле только для чтения следующим образом:

private readonly string STATEMENT_FORMAT = "SELECT {0}{1} FROM [dbo].[{2}]{3}{4}{5}{6}";

Maciej Los

Можете ли вы объяснить, почему вы пытаетесь это сделать?

3 Ответов

Рейтинг:
23

OriginalGriff

То, что вы пытаетесь сделать, вероятно, очень плохая идея: если вы не будете очень, очень осторожны, это оставит вас широко открытыми для случайной или преднамеренной SQL-инъекции, которая может повредить вашу базу данных.

Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

В зависимости от того, как именно вы это используете, вы нанесете своей БД хотя бы некоторый ущерб - если вы или любой другой кодер, использующий это позже, позволит пользователю вводить данные непосредственно в любое из этих полей, риск вырастет почти до уверенности в проблемах.

Я бы очень настоятельно рекомендовал вам отказаться от всей этой идеи!


Рейтинг:
1

F-ES Sitecore

То, что вы делаете, - плохая идея, но если ваш вопрос заключается в том, как вы используете string.format, то обратитесь к документации

Строка.Метод Форматирования (Система) | Microsoft Docs[^]


Рейтинг:
1

MadMyche

Пожалуйста, прочтите ответ OriginalGriffs относительно SQL-инъекции.

Правильный способ поместить имена переменных в инструкцию SQL-это использовать параметры.

string tsql = "Select distinct sysI.rows AS Result , sysTab.NAME FROM sysindexes sysI JOIN sys.Tables sysTab ON sysI.ID = sysTab.OBJECT_ID Where sysI.ID =  OBJECT_ID(@TableName) AND sysI.indid < 2";

string TableName = ""; // insert table name here

using (SqlConnection conn = new SqlConnection("connectionstring")) {
  SqlCommand cmd = new SqlCommand(tsql, conn);
  cmd.Parameters.Add("@TableName", TableName);
  conn.Open();


  // your sql data reader code


  conn.Close();
  conn.Dispose();
}


Ссылка: Класс SqlParameter (System.Data.SqlClient) | Microsoft Docs[^]