2017-01-24 20 views
0

Так я получаю запустить штраф приложений в VB.Net, то феллинг код:Предотвращение SQL Injection и использование SqlDataAdapter

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 Injection XALASKAID = '" & LicenseNumber & "' и что находится внутри запроса. Вместо того, чтобы использовать '" & LicenseNumber & "', мне нужно изменить его примерно так: @LicNum затем добавить myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber

Все, что я получаю в LicenseNumber, используя параметр, является нулевым или пустым. Также мне нужен помощник в моем коде, я думаю, что повторно использую слишком много кодировок. Если можно немного упростить, спасибо.

PS: У меня есть все мое заявление как глобальное.

+0

Вы можете показать * как * вы используете параметр для LicenseNumber – Plutonix

+0

Вы показали нам код, который работает (но SQL-инъективен), и вы спрашиваете нас, почему другой код, который вы нам не показывали, isn Не работает? – David

+0

Код выше работает отлично, проблема в том, что мы не можем использовать '' '& LicenseNumber & "'' внутри запроса, вместо этого я suppost для использования '@ LicID' для предотвращения SQL Injection. когда когда-либо я определяю 'myCmd.Parameters.Add (" @ LicID ", SqlDbType.Int) myCmd.Parameters (" @ LicID "). Value = LicenseNumber' Не работает, когда когда-либо пытаюсь вызвать' @ LicID' в запросе. Также 'LicenseNumber' представляет собой переменную, установленную как String, которая удерживает значение global как текстовое поле txtlicnum. –

ответ

0

У меня было несоответствие в моем первоначальном коде, я сделал некоторые удаления и изменения.

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 

Благодарим за помощь и время.