我通常创建参数化查询以避免SQL注入攻击.但是,我有这种特殊情况,我还没有完全做到这一点:public DataSet getLiveAccountingDSByParameterAndValue(string parameter, string value){string sql = select table_re...
我通常创建参数化查询以避免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注入风险?如果是这样,我该如何避免呢?
基础教程推荐
- SQLite之C#版 System.Data.SQLite使用方法 2023-03-13
- C# 关于LoadLibrary的疑问详解 2023-04-28
- unity 切换场景不销毁物体问题的解决 2023-04-14
- C#利用Task实现任务超时多任务一起执行的方法 2022-11-28
- UGUI ScrollRect滑动定位优化详解 2023-02-16
- 完成OSS.Http底层HttpClient重构封装 支持标准库 2022-10-27
- C#使用Socket实现服务器与多个客户端通信(简单的聊天系统) 2023-02-08
- C# OleDbDataReader快速数据读取方式(3种) 2023-02-03
- C# XML基础入门小结(XML文件内容增删改查清) 2023-05-26
- C# 格式化JSON的两种实现方式 2023-06-08