此查询是否存在SQL注入风险?如果是这样的话,我该如何避免呢
本文关键字:这样的话 何避免 如果 存在 是否 查询 SQL 注入 | 更新日期: 2023-09-27 18:23:48
我通常创建参数化查询以避免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包含下拉列表中所有可能值的列表。在代码隐藏中,将选定的值解析为枚举。
那么,这个查询是否存在SQL注入的风险?
我认为是的,它很容易受到SQL注入的攻击。例如,参数="1=1 OR value"
此外,请考虑该参数是由DropDownList的SelectedValue(不是TextBox,因此输入受到限制)
其实并不重要。恶意用户可以在可执行文件本身或网络数据包上注入任何值(从而发送DropDown上不存在的值)。
如果是,我该如何改进此查询?
您应该检查参数参数并与DropDown值进行比较。对于更通用的数据,我认为应该有库来检查这些东西(但我没有C#的想法…)。
var columns = new [] {"column1", column2", ....};
if (!columns.Contains(parameter))
return or do something else
编辑
唯一的SQL注入风险是使用字符串串联在where子句中传递列名。没有其他办法。真正的屏蔽是检查列名是否有效,它是否存在于表中。
即使ASP.Net有事件验证(检查发布的值是否是下拉列表之一),也不能基于此,因为可以禁用此保护。
与like一起使用的参数不是SQL注入的对象
由于2.0,ASP.NET会自动验证回发和回调参数,以查看它们是否不同。因此,当它对EnableEventValidation
有用时,这是一个很好的例子。
http://odetocode.com/blogs/scott/archive/2006/03/20/asp-net-event-validation-and-invalid-callback-or-postback-argument.aspx
您将得到以下异常:
"无效的回发或回调参数"
您可以通过在codeehind中显式设置它来确保它被设置为
true
,例如在Page的Init
事件中:
protected void Page_Init( object sender, EventArgs e )
{
// don't remove this
Page.EnableEventValidation = True;
}
编辑:哎呀,实际上这个设置不能从codeehind更改,它编译了,但抛出了以下运行时错误:
"EnableEventValidation"属性只能在页面中设置指令或配置部分中。