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

前端之家收集整理的这篇文章主要介绍了vb.net – 我的用户可以注入我的动态sql吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一名为内部用户编写的桌面开发人员,因此我并不担心恶意黑客,但我想知道在更新将在服务器上执行sql的值时是否有任何东西可以输入.

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

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

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

update table set field = value其中pkField = pkVal

使用这个VB.NET代码

  1. Friend Function updateVal(ByVal newVal As String) As Integer
  2. Dim params As Collection
  3. Dim sql As String
  4. Dim ret As Integer
  5.  
  6. sql = _updatesql(newVal)
  7. params = New Collection
  8. params.Add(sqlClientAccess.instance.sqlParam("@sql",DbType.String,sql))
  9. Try
  10. ret = sqlClientAccess.instance.execSP("usp_execsql",params)
  11. Catch ex As Exception
  12. Throw New Exception(ex.Message)
  13. End Try
  14. Return ret
  15. End Function
  16.  
  17. Private Function _updatesql(ByVal newVal As String) As String
  18. Dim sql As String
  19. Dim useDelimiter As Boolean = (_formatType = DisplaySet.formatTypes.text)
  20. Dim position As Integer = InStr(newVal,"'")
  21. Do Until position = 0
  22. newVal = Left(newVal,position) + Mid(newVal,position) ' double embedded single quotes '
  23. position = InStr(position + 2,newVal,"'")
  24. Loop
  25. If _formatType = DisplaySet.formatTypes.memo Then
  26. sql = "declare @ptrval binary(16)"
  27. sql = sql & " select @ptrval = textptr(" & _fieldName & ")"
  28. sql = sql & " from " & _updateTableName & _PKWhereClauses
  29. sql = sql & " updatetext " & _updateTableName & "." & _fieldName & " @ptrval 0 null '" & newVal & "'"
  30. Else
  31. sql = "Update " & _updateTableName & " set " & _fieldName & " = "
  32. If useDelimiter Then
  33. sql = sql & "'"
  34. End If
  35. sql = sql & newVal
  36. If useDelimiter Then
  37. sql = sql & "'"
  38. End If
  39. sql = sql & _PKWhereClauses
  40. End If
  41. Return sql
  42. End Function

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

Redmond’; drop table OrdersTable–

它产生:

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

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

他们还能输入什么来注入sql

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

谢谢.

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

猜你在找的VB相关文章