2016-02-29 55 views
0

由於同樣的話題,我想防止SQL注入執行SQL命令時,如下圖所示:如何在執行從參數字符串連接的腳本時防止SQL注入?

Dim strSQL As String = "ALTER TABLE " & tablename & " ADD " & fieldName & " " & datatype 
_db.Execute_NonQuery(strSQL) 

我嘗試應用解決方案參數http://software-security.sans.org/developer-how-to/fix-sql-injection-microsoft-.net-with-parameterized-queries但我仍然得到這個消息

的名稱類別。

值:特殊元素的中和不當在SQL 命令(「SQL注入」)使用

描述:缺陷的類型的更詳細的描述。

值:此數據庫查詢包含SQL注入缺陷。 system_data_dll.System.Data.IDbCommand.ExecuteNonQuery()調用 構造 使用從用戶提供的輸入派生的變量的動態SQL查詢。 攻擊者可利用此漏洞對數據庫執行任意SQL查詢 。 ExecuteNonQuery()在對象上調用,其中 包含受污染的數據。受污染的數據源自早期調用 到system_data_dll.system.data.sqlclient.sqlcommand.executescalar和 system_data_dll.system.data.common.dbdataadapter.fill。避免 動態構建SQL查詢。而是使用參數化的 準備好的語句來防止數據庫解釋綁定變量的 內容作爲查詢的一部分。始終驗證 用戶提供的輸入以確保其符合預期格式, 儘可能使用集中式數據驗證例程。參考文獻: CWE(http://cwe.mitre.org/data/definitions/89.html)OWASP (http://www.owasp.org/index.php/SQL_injection)WASC (http://webappsec.pbworks.com/SQL-Injection

UPDATE

原始代碼:

Public Shared Sub AlterTable(ByVal table As String, ByVal fieldName As String, ByVal fieldType As String) 

    Dim strSQL As String = "ALTER TABLE " & PROJ & fileCode & " ALTER COLUMN " & fieldName & " " & fieldType 
    _db.Execute_NonQuery(strSQL) 

End Sub 

Public Overloads Function Execute_NonQuery(ByVal sql As String) As Integer 
    Dim result As Integer = 0 

    Try 
     Using conn As New SqlConnection(connString) 
      conn.Open() 
      If conn IsNot Nothing Then 
       Using myTrans As SqlTransaction = conn.BeginTransaction() 
        Using oCmd As SqlCommand = New CommonDao().GetCommand(conn, sql, CommandType.Text) 
         If (oCmd IsNot Nothing) Then 
          oCmd.Transaction = myTrans 

          result = oCmd.ExecuteNonQuery() 
          myTrans.Commit() 
         End If 
        End Using 
       End Using 
      End If 
     End Using 
    Catch ex As Exception 
     _logger.Error("SQL: " & sql) 
     _logger.Error("Error: " & ex.Message) 
     Throw ex 
    End Try 
    Return result 
End Function 

我修改後的代碼

Public Shared Sub AlterTable(ByVal table As String, ByVal fieldName As String, ByVal fieldType As String) 

    Dim strSQL As String = "ALTER TABLE @table ALTER COLUMN @fieldName @fieldType" 
    _db.Execute_NonQuery(strSQL, New String() {"@table","@fieldName","@fieldType"}, New Object() {table, fieldName, fieldType}, False, CommandType.Text) 

End Sub 

Public Overloads Function Execute_NonQuery(ByVal spName As String, ByVal param() As String, ByVal values() As Object, ByVal orderNum As Boolean, ByVal commandType As CommandType) As Integer 
    Dim result As Integer = 0 

    Try 
     Using conn As New SqlConnection(connString) 
      conn.Open() 
      If conn IsNot Nothing Then 
       Using oCmd As SqlCommand = New CommonDAO().GetCommand(conn, spName, commandType) 
        If (oCmd IsNot Nothing) Then 
         If Not (param Is Nothing) AndAlso (param.Length > 0) Then 
          For i = 0 To param.Length - 1 
           oCmd.Parameters.Add(New SqlParameter(param(i), values(i))) 
          Next 
         End If 

         result = oCmd.ExecuteNonQuery() 
        End If 
       End Using 
      End If 
     End Using 
    Catch ex As Exception 
     _logger.Error("SQL: " & spName) 
     _logger.Error("Error: " & ex.Message) 

     Throw ex 
    End Try 

    Return result 
End Function 
+3

您所做的修復是什麼樣的? –

+0

你應該添加你現在擁有的代碼。 – HimBromBeere

+0

@guys,我已更新問題的原始代碼和修改代碼 –

回答

2

動態根據用戶的意見改變表格是一種非常奇怪的做法。我幾乎可以肯定你在這裏做錯了什麼。

你是否需要添加一列或者你是否需要重新設計你的數據庫與另一個表和一些連接?

現在已經說過了,您可以通過將動態SQL推入存儲過程並執行該操作來隱藏問題。這不是很好,但如果你只是迴應一個警告,而且這個代碼不可能從不可信的源代碼執行,它可能是最實用的。

我可以用一個快速谷歌找到最接近的是這樣的:

https://technet.microsoft.com/en-us/library/ms162203(v=sql.90).aspx

這是VB,但我敢肯定,你可以工作了。