Могут ли мои пользователи внедрить мой динамический sql?

I ' Я разработчик рабочего стола, пишу для внутренних пользователей, поэтому я не беспокоюсь о злонамеренных хакерах, но я хотел бы знать, есть ли что-нибудь, что они могли бы ввести при обновлении значения, которое будет выполнять sql на сервере.

Бизнес определяет их контент у меня и схемы есть приложение CRUD, которое не нужно менять при изменении схемы, потому что детали проверки основаны на таблицах, а обновления - с помощью динамического SQL. Я должен поддерживать одинарные кавычки в их вводе данных, поэтому, когда они вводятся, я удваиваю их перед выполнением SQL на сервере. Из того, что я прочитал, однако, этого не должно быть достаточно, чтобы остановить инъекцию.

Поэтому мой вопрос, какой текст они могли бы ввести в текстовое поле произвольной формы, которое могло бы что-то изменить на сервере вместо того, чтобы быть хранится как буквальное значение?

Я создаю инструкцию SQL во время выполнения, которая соответствует шаблону:

обновить таблицу set field = value, где 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

, когда я обновляю текстовое поле до значения

Редмонд '; удалить таблицу OrdersTable -

она генерирует:

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

и обновляет значение до введенного ими литерального значения.

Что еще они могли бы ввести, чтобы вводить SQL?

Опять же, меня не беспокоит, что кто-то хочет взломать сервер на своей работе, но хотел бы знать, как, если бы они могли случайно вставить текст из другого места и что-то сломать.

Спасибо.

6
задан abatishchev 27 August 2010 в 20:36
поделиться