我的用户可以注入我的动态sql吗?

我是一个为内部用户撰写的桌面开发人员,所以我不担心恶意黑客,但我想知道在更新可以在服务器上执行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?

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

谢谢。


假设你转义字符串(根据你所说的话),你应该是安全的。 我唯一能想到的其他事情是,如果您使用基于Unicode的字符集与数据库进行通信,请确保您发送的字符串在该编码中有效。


无论您如何清理用户输入,增加攻击面都是您正在做的事情的真正问题。 如果您回顾SQL注入的历史,您会注意到随着时间的推移,涌现出新的甚至更有创意的方式来破坏它们。 虽然你可能已经避免了已知的事情,但它始终存在着潜在的问题,使得这类代码很难生成。 你会更好地简单地使用不同的方法。


您也可以评估替代解决方案。 使用参数动态生成SQL。 像这样的东西:

// snippet just for get the idea
var parameters = new Dictionary<string, object>();
GetParametersFromUI(parameters);


if (parameters.ContainsKey("@id")) {
    whereBuilder.Append(" AND id = @id");
    cmd.Parameters.AddWithValue("@id", parameters["@id"]);
}
...
链接地址: http://www.djcxy.com/p/42821.html

上一篇: Can my users inject my dynamic sql?

下一篇: How to send email attachments?