【发布时间】:2017-06-09 20:47:43
【问题描述】:
所以我可以在 VB.Net 中很好地运行一个应用程序,下面的代码是:
Private Sub LoadAttachments()
tablegrid = New DataTable
myConn = New SqlConnection("Server=CEDASDSOBSQL02\dev; Database=Insurance; Integrated Security=true")
myConn.Open()
myCmd = myConn.CreateCommand
Dim query As String = "SELECT DocType, docyear, CASE WHEN docmonth IS NULL THEN NULL " & _
"WHEN docmonth = '0' THEN '- All Months -' WHEN docmonth >= 1 AND docmonth <= 12 " & _
"THEN DATENAME(month, DATEADD(month, docmonth, -1)) END DocMonth, DID from dbo.Document where XALASKAID = '" & LicenseNumber & "' and DOCTYPE like '%Report%'"
da = New SqlDataAdapter(query, myConn)
myCmd = New SqlCommand(query, myConn)
myCmd.CommandType = CommandType.Text
da = New SqlDataAdapter(myCmd)
da.Fill(tablegrid)
DataGridView3.DataSource = tablegrid
Label4.Text = "Found " & DataGridView3.Rows.Count & " images"
End Sub
所以这段代码是一个 SQL 注入 XALASKAID = '" & LicenseNumber & "',它在查询内部。而不是使用'" & LicenseNumber & "',我需要将其更改为:@LicNum 然后添加myCmd.Parameters.Add("@LicID", SqlDbType.Int)
myCmd.Parameters("@LicID").Value = LicenseNumber
我使用参数获得的 LicenseNumber 全部为空或为空。我的代码中还需要一些助手,我认为我重用了太多的编码。如果可以简化一点,谢谢。
PS:我的所有声明都是 Global。
【问题讨论】:
-
您可能会显示如何您正在使用 LicenseNumber 的参数
-
您向我们展示了正在运行的代码(但可注入 SQL),但您在问我们为什么您没有向我们展示的其他代码无法运行?
-
上面的代码工作正常,问题是我们不能在查询中使用
'" & LicenseNumber & "',而是我应该使用@LicID来防止SQL注入。当我定义myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber时,当我尝试在查询中调用@LicID时不起作用。此外,LicenseNumber是一个设置为字符串的变量,它将值作为全局值保存在一个名为 txtlicnum 的文本框中。 -
你想让我们乞求你需要帮助的实际代码吗?
-
不,我不需要任何人乞求代码。我注意到这个论坛,人们没有问题,你不能把每个人都称为这个主题的专家,这就是他们创建论坛的原因。我是编码新手,我正在尝试找出一些东西,但我相信 10% 是有帮助的。其余的只是错误地争论或没有正确地发布帖子。英语是我的第二语言,可能这里很多英语是第二语言。但无论如何,谢谢你,我发现了错误,我会重新发布它作为我的问题的修复。
标签: vb.net datagridview parameters sqlcommand sqldataadapter