Я новичок в C # и написал следующий код. После прочтения документации я понял, что мой код предположительно уязвим для SQL-инъекций, потому что я не использую параметры для своих значений (насколько я понимаю, вы можете вводить нежелательные запросы через search.Text). Стоит ли мне вообще беспокоиться об этом, поскольку я все равно блокирую свои значения внутри кавычек ""?

Я нашел здесь несколько направлений, но не могу заставить его работать: Как использовать строковую переменную в выражении sql

public void InvokeDataGridAddress()
{
    switch (ComboBoxSelection.Text)
    {
        case "NASLOV":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE '%" + search.Text + "%' COLLATE Latin1_general_CI_AI";
            break;
        case "LASTNIK":
            comboBoxValue = "SELECT [cbu_naslovi].* FROM [cbu_deli], [cbu_naslovi] WHERE [cbu_deli].LASTNIK LIKE '%" + search.Text + "%' COLLATE Latin1_general_CI_AI AND [cbu_deli].IDX = [cbu_naslovi].ID";
            break;
        case "OBJEKT":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [SO] LIKE '%" + search.Text + "%'";
            break;
        case "PARCELA":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [P1] LIKE '%" + search.Text + "%' OR [P2] LIKE '%" + search.Text + "%' OR [P3] LIKE '%" + search.Text + "%' OR [P4] LIKE '%" + search.Text + "%' OR [P5] LIKE '%" + search.Text + "%' OR [P6] LIKE '%" + search.Text + "%' OR [P7] LIKE '%" + search.Text + "%' OR [P8] LIKE '%" + search.Text + "%' OR [P9] LIKE '%" + search.Text + "%' OR [P10] LIKE '%" + search.Text + "%' OR [P11] LIKE '%" + search.Text + "%' OR [P12] LIKE '%" + search.Text + "%' OR [P13] LIKE '%" + search.Text + "%' OR [P14] LIKE '%" + search.Text + "%' OR [P15] LIKE '%" + search.Text + "%' OR [P16] LIKE '%" + search.Text + "%' OR [P17] LIKE '%" + search.Text + "%'";
            break;
    }
    comboBoxValue = comboBoxValue + " ORDER BY [ULICA] ASC, [OBMOCJE] ASC, LEN ([HS]) ASC, [HS] ASC, [HID] ASC";
    SqlCommand cmd = new SqlCommand
    {
        CommandText = comboBoxValue,
        Connection = con
    };
    Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    dtAddress.Clear();
    da.Fill(dtAddress);
    dg_address.ItemsSource = dtAddress.DefaultView;
    Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
}

РЕДАКТИРОВАТЬ: рабочее решение стало возможным благодаря Оливье Беланжеру и MindSwipe. Я также оставляю ссылку о том, как заставить LIKE работать с параметрами%: Использование SqlParameter в предложении SQL LIKE не работает

public void InvokeDataGridAddress()
{
    switch (ComboBoxSelection.Text)
    {
        case "NASLOV":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE @SearchText COLLATE Latin1_general_CI_AI";
            break;
        case "LASTNIK":
            comboBoxValue = "SELECT [cbu_naslovi].* FROM [cbu_deli], [cbu_naslovi] WHERE [cbu_deli].LASTNIK LIKE @SearchText COLLATE Latin1_general_CI_AI AND [cbu_deli].IDX = [cbu_naslovi].ID";
            break;
        case "OBJEKT":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [SO] LIKE @SearchText";
            break;
        case "PARCELA":
            comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [P1] LIKE @SearchText OR [P2] LIKE @SearchText OR [P3] LIKE @SearchText OR [P4] LIKE @SearchText OR [P5] LIKE @SearchText OR [P6] LIKE @SearchText OR [P7] LIKE @SearchText OR [P8] LIKE @SearchText OR [P9] LIKE @SearchText OR [P10] LIKE @SearchText OR [P11] LIKE @SearchText OR [P12] LIKE @SearchText OR [P13] LIKE @SearchText OR [P14] LIKE @SearchText OR [P15] LIKE @SearchText OR [P16] LIKE @SearchText OR [P17] LIKE @SearchText";
            break;
    }
    comboBoxValue = comboBoxValue + " ORDER BY [ULICA] ASC, [OBMOCJE] ASC, LEN ([HS]) ASC, [HS] ASC, [HID] ASC";
    SqlCommand cmd = new SqlCommand
    {
        CommandText = comboBoxValue,
        Connection = con
    };
    cmd.Parameters.AddWithValue("@SearchText", '%' + search.Text + '%');
    Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    dtAddress.Clear();
    da.Fill(dtAddress);
    dg_address.ItemsSource = dtAddress.DefaultView;
    Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
}
0
Adephx 23 Окт 2018 в 15:40

2 ответа

Лучший ответ

Вы уязвимы для SQL-инъекций.

Во-первых, лучше перечислить то, что вы хотите, в своем выборе следующим образом:

SELECT Name, Address, City FROM [YourTable] вместо SELECT * FROM [YourTable]

Во-вторых, вы должны вставить свой параметр в свой запрос следующим образом:

SELECT Name, Address, City FROM [YourTable] WHERE Name = @Name

И в вашей команде:

cmd.Parameters.AddWithValue("@Name", YourValue)

Надеюсь, это поможет,

Вот несколько ссылок: Каковы хорошие способы предотвращения внедрения SQL-кода? https://www.codeproject.com/Tips/706692/Preventing- SQL- Injection - атак

3
Olivier Belanger 23 Окт 2018 в 12:53

Короткий ответ: да, вам всегда нужно беспокоиться о SQL Injection, вы не поверите, насколько изобретательны некоторые хакеры с этим.
Хотя у меня большой опыт работы с C #, я никогда не работал с прямым SQL на C #, я всегда использовал EF с LINQ для баз данных
В любом случае здесь идет:

using (var con = new SqlClient.SqlConnection(conectionString))
using (var cmd = SqlClient.SqlCommand())
{
    con.Open();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE '%@Title%' COLLATE Latin1_general_CI_AI";
    cmd.Parameters.Add("@Title", search.Text);
}

Некоторое объяснение:
using: ключевое слово using довольно простое. Обычно все, что вы помещаете между круглыми скобками (например, Class c = new Class();), должно реализовывать IDisposable, эта переменная удаляется после фигурных скобок
Syntatic Candy: обычно после using() необходимо ставить фигурные скобки {}, за исключением случаев, когда это один или другой оператор using
Sql Stuff: con.Open открывает наше соединение с базой данных, и мы устанавливаем его как соединение, которое наша команда будет использовать с cmd.Connection = con.
Теперь нам нужно сказать, что это за тип команды. Выполняя cmd.CommandType = CommandType.Text, мы сообщаем команде, что это SQL-запрос.
А теперь нам нужно определить наш запрос, но вместо объединения строки с + мы используем @SomeName в качестве заполнителя.
И, наконец, мы заменяем наш @SomeName на наши фактические значения, выполняя cmd.Parameters.Add("@SomeName", value), где @SomeName может быть любым, но он должен быть таким же, как заполнитель, который мы хотим заменить в SQL-запросе
Именно здесь мы фактически защищаем себя от атак SQL-инъекций, поскольку cmd.Parameters.Add() делает все, что нам нужно, иначе пришлось бы делать вручную.

Надеюсь, это поможет и больше не смущает вас

Примечание. если вас интересует Entity Framework (EF) или LINQ, вот хороший источник: Первое руководство по базе данных EF

5
MindSwipe 9 Авг 2019 в 09:48
52949350