数据库
首页 > 数据库> > c# – 此查询是否存在SQL注入风险?如果是这样,我该如何避免呢?

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

作者:互联网

我通常创建参数化查询以避免SQL注入攻击.但是,我有这种特殊情况,我还没有完全做到这一点:

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作为参数,但如果我尝试对参数执行相同操作,则查询将失败.

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

解决方法:

就在这里:

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

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

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

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

ParameterEnum包含下拉列表中所有可能值的列表.在后面的代码中,将所选值解析为枚举.

标签:c,sql-injection,asp-net,ado-net,parameterized
来源: https://codeday.me/bug/20190609/1208458.html