dan*_*ays 3 sql vb.net ado.net
我有一个控件,在回发时,将表单结果保存回数据库.它通过遍历查询字符串来填充要保存的值.因此,对于以下SQL语句(为了讨论而大大简化)......
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
Run Code Online (Sandbox Code Playgroud)
...它会循环通过查询字符串键:
For Each Key As String In Request.QueryString.Keys
Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key))
Next
Run Code Online (Sandbox Code Playgroud)
但是,我现在遇到的情况是,在某些情况下,这些变量中的某些变量可能不存在于查询字符串中.如果我不在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
Run Code Online (Sandbox Code Playgroud)
... 失败了.
攻击它的最佳方法是什么?我必须用RegEx解析SQL块,扫描查询字符串中不存在的变量名吗?或者,有更优雅的方法吗?
更新:检测VB代码隐藏中的空值会破坏将代码与其上下文分离的目的.我宁愿不为每个可能传递或不传递的可能变量的条件丢弃我的函数.
首先,我建议不要在查询字符串上添加所有条目作为参数名称,我不确定这是不安全的,但我不会抓住这个机会.
问题是你在打电话
Command.Parameters.AddWithValue("@val2", null)
Run Code Online (Sandbox Code Playgroud)
而不是这个你应该打电话:
If MyValue Is Nothing Then
Command.Parameters.AddWithValue("@val2", DBNull.Value)
Else
Command.Parameters.AddWithValue("@val2", MyValue)
End If
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8743 次 |
| 最近记录: |