c# - 此查询是否存在 SQL 注入(inject)风险?如果是这样,我该如何避免呢?

标签 c# asp.net ado.net sql-injection parameterized

我通常创建参数化查询以避免 SQL 注入(inject)攻击。但是,我有这种特殊情况,我无法完全做到这一点:

public DataSet getLiveAccountingDSByParameterAndValue(string parameter, string value)
{
    string sql = "select table_ref as Source, method as Method, sip_code as Code, " +
        " from view_accountandmissed " +
        " where " + parameter + " like @value " +
        " order by time DESC ";
    MySqlCommand cmd = commonDA.createCommand(sql);
    cmd.Parameters.Add("@value", MySqlDbType.String);
    cmd.Parameters["@value"].Value = "%" + value + "%";

    MySqlDataAdapter objDA = commonDA.createDataAdapter(cmd);
    DataSet objDS = new DataSet();
    objDA.Fill(objDS);
    return objDS;
}

如您所见,我正在创建 @value 作为参数,但如果我尝试对 parameter 执行相同的操作,查询将失败。

那么,这个查询是否存在 SQL 注入(inject)的风险?此外,请注意参数 是由DropDownList 的SelectedValue(不是TextBox,因此输入是有限的)设置的。如果是这样,我该如何改进这个查询?

最佳答案

是的,有:

" where " + parameter + " like @value " +

参数中的值是您的风险。在回发中,您应该检查所选值是否在下拉列表的起始值集中。

将参数设为枚举并将枚举传递给您的函数。这将消除风险(类似于:未测试):

public DataSet getLiveAccountingDSByParameterAndValue(ParameterEnum parameter, string value)
.....
    " where " + parameter.ToString() + " like @value " +

ParameterEnum 包含下拉列表中所有可能值的列表。在您的隐藏代码中,将所选值解析为枚举。

关于c# - 此查询是否存在 SQL 注入(inject)风险?如果是这样,我该如何避免呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9208654/

相关文章:

mysql - MySQL 的 System.Data.SqlClient 命名空间?

c# - 使用 ADO.NET 更新一行中的多个列

c# - 从 header Asp.Net Core WebApi 绑定(bind)自定义对象

C# 自动模式比较 SQL 数据库列表和更新

c# - .NET Core 应用程序中的 .NET Framework 依赖项

asp.net - 为什么类型推断 (var) 不能与 ASP.NET GridView.Rows 属性一起使用?

c# - Enumerable.Count()==n 的替代品

javascript - asp.net 隐藏字段值未获取表单加载事件

c# - Execute Scalar、Execute Reader 和 Data Set 在哪里使用?