如何防止 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 表示一个查询参数,您可以将其从您的应用程序传递给查询。