vb.net – 我的用户可以注入我的动态sql吗?

我是一名为内部用户编写的桌面开发人员,因此我并不担心恶意黑客,但我想知道在更新将在服务器上执行sql的值时是否有任何东西可以输入.

业务定义了他们的内容模式,我有一个CRUD应用程序,当模式更改时不必更改它们,因为验证详细信息是由表驱动的,而更新是使用动态SQL.我必须在他们的数据条目中支持单引号,所以当他们输入它们时,我会在服务器上执行SQL之前将它们加倍.然而,从我读过的内容来看,这不足以阻止注射.

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

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

update table 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,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'

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

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

同样,我并不担心有人想在他们的工作中破解服务器,但想知道如果他们不小心粘贴来自其他地方的文本并破坏某些东西.

谢谢.

假设你逃避字符串文字(你说你正在做的事情),你应该是安全的.我能想到的另一件事是,如果你使用基于unicode的字符集与数据库通信,请确保你发送的字符串在该编码中有效.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...