所以我的问题实际上有超过2部分,但所有链接到保护我的应用程序免受SQL注入。
最近我正在重建我的应用程序,使其SQL注入证明。我的应用程序是用VB编写的。. NET和我使用Parameters.Add
来保护查询。
UPDATE第一个问题:
发现OLEDB中的NVARCHAR
数据类型等于WChar
数据类型。当鼠标悬停在WChar
上时,它在描述中显示它是WSTR
。
我有几个问题,虽然我不能在网上找到答案。第一个,我想也是最简单的一个是OleDB中NVARCHAR的数据类型。在做一些研究时,我发现了这个链接https://msdn.microsoft.com/en-us/library/ms130984.aspx,其中指出,在OleDB的DBTYPE_WSTR
数据类型是相同的NVARCHAR
(我在我的t-SQL服务器中使用)。然而,在我的VB应用程序中添加参数时,没有这样的数据类型可用(WSTR
)。VarChar
, VarWChar
, WChar
, LongVarChar
, LongVarWChar
。
问题是,哪一个是正确的?我猜是VarChar
。
——更新到这里——
第二个问题是关于在查询中涉及IF条件时如何处理参数(参见下面的示例)。
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=""" & sOrderType & """)"
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
OpenConn()
cmd = New OleDbCommand(sSQL1, cn)
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
dr.Close()
CloseConn()
我应该如何用参数重写这个?我是否需要在if条件下与Parameters.Add
一起实例化cmd = New OleDbCommand(sSQL1, cn)
?但我想这也意味着我必须更早地打开连接?
我想过这样重写:
OpenConn()
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=?)"
cmd = New OleDbCommand(sSQL1, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OrderType", OleDbType.VarChar).Value = sOrderType
Else
cmd = New OleDbCommand(sSQL1, cn)
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
不知道这是否有效(现在我很遗憾不能测试它)。
另一个问题是:我是否需要在查询中使用dateadd
的参数(参见上面的查询)?如果我做了,怎么做?
最后一个问题是,当我使用Parameters.Add
时,最好也给出size
值,还是没有必要?
提前感谢!
我对你第一个问题的回答是我认为这是你想要的相等数据类型列表:
SQL Server | OLEDB (ADO => ad+...)
-----------+---------------
char | Char
nchar | WChar
varchar | VarChar
nvarchar | VarWChar
text | LongVarChar
ntext | LongWVarChar