如何在执行从参数字符串连接的脚本时阻止SQL注入?

时间:2016-02-29 07:39:33

标签: sql .net vb.net sql-injection

作为同一主题,我想在执行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

1 个答案:

答案 0 :(得分:2)

动态改变表以响应用户输入是一种非常奇怪的方法。我几乎肯定你在这里做错了什么。

您是否需要添加一个列,或者您是否只需要使用另一个表和一些连接来重新设计数据库?

现在已经说过,你可以通过将动态SQL推入存储过程并执行它来隐藏问题。这并不好,但如果你只是回应一个警告而且这个代码无法从不受信任的来源执行,那么它可能是最实用的。

我能找到最接近快速谷歌的是:

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

这是VB,但我相信你可以解决它。