Как предотвратить внедрение MySQL в динамическое where?

#c# #mysql #sql #where-clause #sql-injection

#c# #mysql #sql #where-предложение #sql-инъекция

Вопрос:

У меня есть API в моем проекте C # WebAPI, который возвращает некоторые элементы из моей базы данных MySQL.

Возвращаемые данные имеют видимость, установленную в таблице, а параметры, установленные в вызове API, указывают, какие данные должны отображаться, например, если я нахожусь на маршруте ВЫВОДА моего веб-сайта, я отправляю в API «ВЫНОС», и я должен выбирать данные только там, где включен ВЫНОС флага.

Итак, у меня есть свой метод, с помощью которого я получаю данные, но я думаю, что он предлагается для внедрения MySQL в виде последовательности строк в запросе, поэтому в зависимости от типа я устанавливаю свой where следующим образом:

         switch (type)
        {
            case "TAKEAWAY":
                VISIBILITY = "vis.TAKEAWAY_VIS = 'SI' ";
                break;
            case "ASPORTO":
                VISIBILITY = "vis.ASPORTO_VIS = 'SI' ";
                break;
            case "ECOM":
                VISIBILITY = "vis.ECOMMERCE_VIS = 'SI' ";
                break;
        }
  

И установите его в запросе следующим образом:

             var query_plu = @"SELECT 
    ID_MENU_PRP,
    ID_PLUREP,
    CODICE_PRP,
    des.ESTESA_DES,
    UM_PRP
FROM
    vo_plurep plu
        INNER JOIN
    vo_visibility vis ON plu.ID_PLUREP = vis.ID_PLUREP_VIS
WHERE "   VISIBILITY   @"
        AND plu.ATTIVO_PRP = 'True'
ORDER BY MENU_PRP ASC, des.ORDER_DES ASC;";
  

И затем я выполняю этот запрос следующим образом:

 MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(query_plu, connection);
  

Но как я могу предотвратить объединение строки в запросе для динамического where?

Ответ №1:

Ваш код выглядит безопасным. Хотя вы динамически генерируете часть строки запроса, switch оператор на стороне приложения гарантирует, что вредоносное значение не может пройти.

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

 SELECT 
    ID_MENU_PRP,
    ID_PLUREP,
    CODICE_PRP,
    des.ESTESA_DES,
    UM_PRP
FROM vo_plurep plu
INNER JOIN vo_visibility vis ON plu.ID_PLUREP = vis.ID_PLUREP_VIS
WHERE 
    plu.ATTIVO_PRP = 'True'
    AND (
           (@type = 'TAKEAWAY' AND vis.TAKEAWAY_VIS = 'SI')
        OR (@type = 'ASPORTO'  AND vis.ASPORTO_VIS  = 'SI')
        OR (@type = 'ECOM'     AND vis.ECOM_VIS     = 'SI')
    )
ORDER BY MENU_PRP ASC, des.ORDER_DES ASC
  

@type представляет параметр запроса, который вы можете передать в запрос из своего приложения.