我有一个控件,在回发时,将表单结果保存回数据库.它通过遍历查询字符串来填充要保存的值.因此,对于以下SQL语句(为了讨论而大大简化)......
UPDATE MyTable SET MyVal1 = @val1, MyVal2 = @val2 WHERE @id = @id
...它会循环通过查询字符串键:
For Each Key As String In Request.QueryString.Keys Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key)) Next
但是,我现在遇到的情况是,在某些情况下,这些变量中的某些变量可能不存在于查询字符串中.如果我不在querystring中传递val2,我会收到一个错误:System.Data.SqlClient.SqlException: Must declare the scalar value "@val2"
.
尝试检测SQL语句中的缺失值...
IF @val2 IS NOT NULL UPDATE MyTable SET MyVal1 = @val1, MyVal2 = @val2 WHERE @id = @id
... 失败了.
攻击它的最佳方法是什么?我必须用RegEx解析SQL块,扫描查询字符串中不存在的变量名吗?或者,有更优雅的方法吗?
更新:检测VB代码隐藏中的空值会破坏将代码与其上下文分离的目的.我宁愿不为每个可能传递或不传递的可能变量的条件丢弃我的函数.
首先,我建议不要在查询字符串上添加所有条目作为参数名称,我不确定这是不安全的,但我不会抓住这个机会.
问题是你在打电话
Command.Parameters.AddWithValue("@val2", null)
而不是这个你应该打电话:
If MyValue Is Nothing Then Command.Parameters.AddWithValue("@val2", DBNull.Value) Else Command.Parameters.AddWithValue("@val2", MyValue) End If