2017-01-24 16 views
0

を使用しては、次のとおりです。防止SQLインジェクションとの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インジェクションXALASKAID = '" & LicenseNumber & "'であり、それは、クエリ内にあります。 '" & LicenseNumber & "'を使用する代わりに、次のように変更する必要があります。 myCmd.Parameters.Add("@LicID", SqlDbType.Int) myCmd.Parameters("@LicID").Value = LicenseNumber

パラメータを使用してLicenseNumberに入っているすべてが空または空です。また、私はコードをあまりにも多くのコードを再利用していると思う私のコードで助手が必要です。ちょっと単純化することができれば、ありがとう。

PS:私はすべての宣言をグローバルとして持っています。

+0

あなたは、LicenseNumberのパラメータをどのように使用しているのかを表示するかもしれません。 – Plutonix

+0

あなたは私たちに(あなたはSQL注入可能な)コードを示しています。働いている? – David

+0

上記のコードは正常に動作しますが、クエリ内で ''"&LicenseNumber& "''を使用することはできません。代わりに '@ LicID'を使用してSQLインジェクションを防止することをお勧めします。 Value = LicenseNumber' '@LicID'を呼び出そうとすると動作しません。これは、私が' @LicID'を呼び出すときに動作しません。クエリ内にあります。また、 'LicenseNumber'は、txtlicnumというテキストボックスからグローバルとして値を保持するStringとして設定された変数です。 –

答えて

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 

ありがとうございました。

関連する問題