由於同樣的話題,我想防止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
您所做的修復是什麼樣的? –
你應該添加你現在擁有的代碼。 – HimBromBeere
@guys,我已更新問題的原始代碼和修改代碼 –