我通常创建参数化查询以避免 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/