作为同一主题,我想在执行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)
更新
原始代码:
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
答案 0 :(得分:2)
动态改变表以响应用户输入是一种非常奇怪的方法。我几乎肯定你在这里做错了什么。
您是否需要添加一个列,或者您是否只需要使用另一个表和一些连接来重新设计数据库?
现在已经说过,你可以通过将动态SQL推入存储过程并执行它来隐藏问题。这并不好,但如果你只是回应一个警告而且这个代码无法从不受信任的来源执行,那么它可能是最实用的。
我能找到最接近快速谷歌的是:
https://technet.microsoft.com/en-us/library/ms162203(v=sql.90).aspx
这是VB,但我相信你可以解决它。