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