如何防止 MySql 动态注入?
How to prevent MySql Injection in dynamic where?
我的 C# WEBApi 项目中有一个 API,其中 return 我的 MySQL 数据库中的一些项目。
return 的数据在 table 中设置了可见性,在 API 调用中设置的参数说明应该显示哪种数据,就像我在我网站的 TAKEAWAY 路由中,我发送到 API“TAKEAWAY”,我应该 SELECT 数据仅在 TAKEAWAY 标志打开的地方。
所以我有自己的方法来获取数据,但我认为建议从查询中的字符串连接开始 MySQL 注入,因此根据类型我设置我的位置如下:
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 查询中连接字符串?
您的代码看起来很安全。尽管您正在动态生成部分查询字符串,但应用程序端的 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
表示一个查询参数,您可以将其从您的应用程序传递给查询。
我的 C# WEBApi 项目中有一个 API,其中 return 我的 MySQL 数据库中的一些项目。
return 的数据在 table 中设置了可见性,在 API 调用中设置的参数说明应该显示哪种数据,就像我在我网站的 TAKEAWAY 路由中,我发送到 API“TAKEAWAY”,我应该 SELECT 数据仅在 TAKEAWAY 标志打开的地方。
所以我有自己的方法来获取数据,但我认为建议从查询中的字符串连接开始 MySQL 注入,因此根据类型我设置我的位置如下:
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 查询中连接字符串?
您的代码看起来很安全。尽管您正在动态生成部分查询字符串,但应用程序端的 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
表示一个查询参数,您可以将其从您的应用程序传递给查询。