vb.net - 我的用户可以注入(inject)我的动态 sql 吗?

标签 vb.net sql-server-2005

我是为内部用户编写的桌面开发人员,所以我不担心恶意黑客,但我想知道他们在更新将在服务器上执行 sql 的值时是否可以输入任何内容。

业务定义了他们的内容架构,我为他们提供了一个 CRUD 应用程序,当他们的架构更改时不必更改它,因为验证详细信息是表驱动的,并且更新是使用动态 SQL 进行的。我必须在他们的数据输入中支持单引号,所以当他们输入它们时,我会在服务器上执行 SQL 之前将它们加倍。然而,从我所读到的,这应该不足以停止注入(inject)。

所以我的问题是,他们可以在自由格式的文本字段中输入什么文本,这些文本可以更改服务器上的某些内容,而不是存储为文字值?

基本上,我在运行时构建了一个遵循以下模式的 SQL 语句:

更新表集字段 = 值 where pkField = pkVal

使用此 VB.NET 代码:

Friend Function updateVal(ByVal newVal As String) As Integer
    Dim params As Collection
    Dim SQL As String
    Dim ret As Integer

    SQL = _updateSQL(newVal)
    params = New Collection
    params.Add(SQLClientAccess.instance.sqlParam("@SQL", DbType.String, 0, SQL))
    Try
        ret = SQLClientAccess.instance.execSP("usp_execSQL", params)
    Catch ex As Exception
        Throw New Exception(ex.Message)
    End Try
    Return ret
End Function

Private Function _updateSQL(ByVal newVal As String) As String
    Dim SQL As String
    Dim useDelimiter As Boolean = (_formatType = DisplaySet.formatTypes.text)
    Dim position As Integer = InStr(newVal, "'")
    Do Until position = 0
        newVal = Left(newVal, position) + Mid(newVal, position)       ' double embedded single quotes '
        position = InStr(position + 2, newVal, "'")
    Loop
    If _formatType = DisplaySet.formatTypes.memo Then
        SQL = "declare @ptrval binary(16)"
        SQL = SQL & " select @ptrval = textptr(" & _fieldName & ")"
        SQL = SQL & " from " & _updateTableName & _PKWhereClauses
        SQL = SQL & " updatetext " & _updateTableName & "." & _fieldName & " @ptrval 0 null '" & newVal & "'"
    Else
        SQL = "Update " & _updateTableName & " set " & _fieldName & " = "
        If useDelimiter Then
            SQL = SQL & "'"
        End If
        SQL = SQL & newVal
        If useDelimiter Then
            SQL = SQL & "'"
        End If
        SQL = SQL & _PKWhereClauses
    End If
    Return SQL
End Function

当我将文本字段更新为值时

Redmond'; drop table OrdersTable--



它生成:
Update caseFile set notes = 'Redmond''; drop table OrdersTable--' where guardianshipID = '001168-3'

并将值更新为他们输入的文字值。

他们还能输入什么来注入(inject) SQL?

同样,我不担心有人想在他们的工作中破解服务器,但想知道他们是否会不小心从其他地方粘贴文本并破坏某些东西。

谢谢。

最佳答案

无论您如何清理用户输入,增加攻击面都是您所做工作的真正问题。如果您回顾 SQL 注入(inject)的历史,您会注意到随着时间的推移,已经出现了通过它们造成严重破坏的新的甚至更有创意的方法。虽然您可能已经避免了已知的情况,但总是潜伏在拐角处的东西使这种类型的代码难以生产。你最好简单地使用不同的方法。

关于vb.net - 我的用户可以注入(inject)我的动态 sql 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587814/

相关文章:

vb.net - 根据 Selenium 中的动态索引从下拉列表中选择一个值

javascript - JavaScript 中函数未定义冲突

mysql - 如何同步2个数据库中的产品库存。 Mysql和MSSQL实时

sql - SQL触发器中的更新函数

sql-server-2005 - 存储地理数据

vb.net - 按 F1 时将焦点设置为文本框

c# - 将 C# WCF 应用程序转换为 Visual Basic

vb.net - 通过 COM 接口(interface)向 VBA 公开 .NET DataTable 属性

sql-server-2005 - 优化加密列搜索

sql-server - SQL Server 2005 中的拦截和重写查询