kida atlantis Ответов: 2

Sqlquery, имеющий { } из кода C# позади ? есть какие-нибудь подсказки, почему это происходит?


Привет ребята,

Я написал один встроенный запрос с использованием C# для команды SqlConnection.Текст

вот как я поступаю, командир.Text= "{ select * from table} "почему эти" {"и"} " идут до и после фактического запроса .Любые подсказки пожалуйста ответьте

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

private List<objecttype> GetFullData(int id, int[] array1)
{

            DbConnection conn = null;
            DbCommand command = null;
            DbDataReader reader = null;
<pre>var templist = new List<objecttype>();
            try
            {  conn = DB.GetConnection();
                command = conn.CreateCommand();              
                command.CommandType = CommandType.Text;              
                var sbSql = new StringBuilder(
                    @"
          SELECT * from table(long inner join of 2 tables)");
                if (workgroups.Length > 0)
                {
                    sbSql.AppendFormat("WHERE column_3 IN({0})", string.Join(",", array1));
                }
                command.CommandText = sbSql.ToString();
                reader = command.ExecuteReader();


}

2 Ответов

Рейтинг:
4

Richard Deeming

НИКОГДА используйте конкатенацию строк (или string.Format, или AppendFormat, или интерполированные строки *,...) для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

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

Правильная передача нескольких значений параметров-это слегка сложнее, чем должно быть. Но это не особенно сложно:

private List<objecttype> GetFullData(int id, int[] workgroups)
{
    try
    {
        using (var conn = DB.GetConnection())
        using (var command = conn.CreateCommand())
        {
            command.CommandType = CommandType.Text;
            
            var sb = new StringBuilder(@"SELECT * FROM ...");
            if (workgrouns.Length != 0)
            {
                sb.Append(" WHERE column_3 IN (");
                for (int index = 0; index < workgroups.Length; index++)
                {
                    if (index != 0) sb.Append(", ");
                    
                    string name = "@p" + index;
                    command.Parameters.AddWithName(name, workgroups[index]);
                    sb.Append(name);
                }
                sb.Append(")");
            }
            
            command.CommandText = sb.ToString();
            
            using (var reader = command.ExecuteReader())
            {
                ...


Возможно, вы захотите взглянуть на Щеголеватый[^], что делает этот вид запроса намного проще.


* Была статья, в которой объяснялось, как это сделать безопасно, но я не могу найти ссылку на данный момент.


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


Рейтинг:
2

OriginalGriff

Мы не можем сказать-там нет ничего, что могло бы добавить фигурные скобки в ваш строковый конструктор.
Так что либо он находится в отредактированном соединении, либо его вообще нет в этом коде.
Начните с отладчика, проверьте содержимое StringBuilder во время его работы и посмотрите, сможете ли вы точно определить, куда идут скобки - это может дать вам ключ к тому, откуда они берутся, и, по крайней мере, гарантирует, что именно этот код их генерирует.
Если это не поможет, усеките строку SQL до тех пор, пока они не исчезнут, и посмотрите на последний бит, который вы удалили. Не имеет значения, что SQL не будет работать, так как вы все равно не будете его выполнять!

Извините, но мы не можем сделать ничего из этого для вас!