【问题标题】:Prevent SQL Injection and using SqlDataAdapter防止 SQL 注入和使用 SqlDataAdapter
【发布时间】: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 = '" &amp; LicenseNumber &amp; "',它在查询内部。而不是使用'" &amp; LicenseNumber &amp; "',我需要将其更改为:@LicNum 然后添加myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber

我使用参数获得的 LicenseNumber 全部为空或为空。我的代码中还需要一些助手,我认为我重用了太多的编码。如果可以简化一点,谢谢。

PS:我的所有声明都是 Global。

【问题讨论】:

  • 您可能会显示如何您正在使用 LicenseNumber 的参数
  • 您向我们展示了正在运行的代码(但可注入 SQL),但您在问我们为什么您没有向我们展示的其他代码无法运行?
  • 上面的代码工作正常,问题是我们不能在查询中使用'" &amp; LicenseNumber &amp; "',而是我应该使用@LicID来防止SQL注入。当我定义myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber 时,当我尝试在查询中调用@LicID 时不起作用。此外,LicenseNumber 是一个设置为字符串的变量,它将值作为全局值保存在一个名为 txtlicnum 的文本框中。
  • 你想让我们乞求你需要帮助的实际代码吗?
  • 不,我不需要任何人乞求代码。我注意到这个论坛,人们没有问题,你不能把每个人都称为这个主题的专家,这就是他们创建论坛的原因。我是编码新手,我正在尝试找出一些东西,但我相信 10% 是有帮助的。其余的只是错误地争论或没有正确地发布帖子。英语是我的第二语言,可能这里很多英语是第二语言。但无论如何,谢谢你,我发现了错误,我会重新发布它作为我的问题的修复。

标签: vb.net datagridview parameters sqlcommand sqldataadapter


【解决方案1】:

我的原始代码中有不匹配的定义,我做了一些删除和更改。

Private Sub LoadAttachments()
        attachmentsTable = New DataTable

        Dim mAdapter As New SqlDataAdapter
        If LicenseNumber IsNot Nothing Then
            If Not String.IsNullOrEmpty(InsCommonLib.Settings.MSSqlConStr) Then
                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 = @LICNUM and DOCTYPE like '%Report%'"

                Using mConn As New SqlConnection(InsCommonLib.Settings.MSSqlConStr)
                    Using mCmd As New SqlCommand(query, mConn)
                        mCmd.Parameters.Add(New SqlParameter("@LICNUM", LicenseNumber))
                        mConn.Open()
                        mAdapter.SelectCommand = mCmd
                        mAdapter.Fill(attachmentsTable)
                    End Using
                End Using
            End If

        End If

        DataGridView3.DataSource = attachmentsTable
        Label4.Text = "Found " & DataGridView3.Rows.Count & " images"
    End Sub

感谢您的帮助和时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2020-01-30
    • 2019-06-03
    • 2016-11-16
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多