#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
представляет параметр запроса, который вы можете передать в запрос из своего приложения.