2017-01-24 2 views
0

Je pas à courir une amende d'application à l'intérieur VB.Net, le code folling est:Prévenir SQL Injection et en utilisant 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 

Donc, ce code est une injection SQL XALASKAID = '" & LicenseNumber & "' et qui est à l'intérieur de la requête. Au lieu d'utiliser '" & LicenseNumber & "' je dois changer quelque chose comme: @LicNum puis ajouter myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber

Tout ce que je reçois dans le LicenseNumber en utilisant le paramètre est nul ou vide. Aussi j'ai besoin d'un assistant dans mon code je pense que je réutilise trop de code. Si c'est possible de simplifier un peu, merci. PS: J'ai toute ma déclaration en tant que Global.

+0

vous pouvez montrer * comment * vous utilisez un paramètre pour LicenseNumber – Plutonix

+0

Vous nous avez montré le code qui fonctionne (mais SQL-injectable), et vous nous demandez pourquoi d'autres codes que vous ne nous avez pas montré isn ne travaille pas? – David

+0

Le code ci-dessus fonctionne très bien, le problème est que nous ne pouvons pas utiliser ''" & LicenseNumber & "'' à l'intérieur de la requête, je préfère utiliser '@ LicID' pour empêcher l'injection SQL. quand jamais je définis le 'myCmd.Parameters.Add (" @ LicID ", SqlDbType.Int) myCmd.Parameters (" @ LicID "). Value = LicenseNumber' Ne fonctionne pas quand j'essaie d'appeler' @ LicID' dans la requête. De plus 'LicenseNumber' est une variable définie comme String qui contient la valeur globale d'une zone de texte appelée txtlicnum. –

Répondre

0

J'ai eu une définition de discordance dans mon code d'origine, j'ai effectué une suppression et des modifications.

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 

Merci pour l'aide et le temps.