【问题标题】:VB6: Is this Sub ever reached?VB6:这个 Sub 是否曾经到达过?
【发布时间】:2016-06-14 21:59:01
【问题描述】:

我正在重写一些 VB6 遗留程序并运行以下代码(为安全起见更改了变量名)...

  Dim blnValue1 As Boolean
  Dim strForValue As String

  sqlQuery = "SELECT a.* FROM databaseName a " & _
                  "WHERE a.ssn = '" & strInput1 & "'" & _
                  " and a.column2 = '" & strInput2 & "'"

  Set rsInsert = New ADODB.Recordset
  rsInsert.Open sqlQuery, Connection

  blnValue1 = False
  Do Until rsInsert.EOF
    strForValue = Trim(rsInsert("value"))

    If strForValue <> "1234" Then
      [some unimportant code here]
    End If

    blnValue1 = True
    rsInsert.MoveNext
  Loop

  If blnValue1 = False Then
    InsertValue
  End If

我知道这可能很明显,但我想确保:在这段代码中永远不会调用 Sub“InsertValue”,对吧?我的意思是当 Recordset 正在读取时 bool 设置为 true。是否有我不知道的 VB6 或 Recordset 特定规则会在某些时候使“blnValue1”为假?

我无法运行旧的 VB6 代码来检查它是否到达“InsertValue”子,因为它会访问我不想弄乱的生产文件,直到完美处理代码所做的一切。

【问题讨论】:

  • 啊! SQL 注入漏洞,烧死我们了!
  • 当然可以。只需要 rsInsert 记录集中没有记录。

标签: vb6


【解决方案1】:

我的第一直觉是,如果 sql 查询没有返回任何结果,可以调用 InsertValue 函数。不管实际发生什么,我相信这是作者的意图。

不过,经过进一步思考,我对在第一次调用 MoveNext 之前没有为 RecordSet 设置 EOF 的问题有一个模糊的怀疑 — 类似于文件流在您尝试之后才设置它读到文件末尾——所以我去了documentation。读到这里,如果没有结果,看起来EOF 设置为True

如果打开一个不包含记录的 Recordset 对象,BOF 和 EOF 属性设置为 True,Recordset 对象的 RecordCount 属性设置为 0。

因此,我最初的直觉得到了证实。 在查询没有返回任何结果的情况下会调用InsertValue方法。

当您使用此代码时,您应该修复那个讨厌的 sql 注入漏洞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 2015-11-12
    • 2020-12-08
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多