【问题标题】:Understanding Classic ASP了解经典 ASP
【发布时间】:2012-01-10 19:50:33
【问题描述】:

我正在查看一些旧代码,发现一个我无法理解的部分......据我所知,这只是一个简单的插入。但他们为什么这样做呢?是否可以重写为插入,或者我可能会破坏某些东西?

请看下面:

Set TextRS = Server.CreateObject("ADODB.RecordSet")
 Set TextRS.ActiveConnection = Conn
 TextRS.Source = "SELECT IDX,TIMESTAMP,CURRENTFLAG,TEXT FROM " & TextTable & " WHERE 1=2 FOR UPDATE"
 TextRS.CursorLocation = 2
 TextRS.CursorType = 3
 TextRS.Open ,,,3

 TextRS.AddNew
 TextRS(0).Value = IDX
 TextRS(1).Value = Timestamp
 TextRS(2).Value = "Y"
  TextRS(3).AppendChunk TextPiece
 TextRS.Update

 TextRS.Close

【问题讨论】:

  • 这是对插入语句进行参数化并避免 SQL 注入的一种方法。如果您确实将其更改为插入语句,请确保将查询参数化。

标签: sql-server sql-server-2008 asp-classic adodb cursor-position


【解决方案1】:

这部分来源让我有点困惑....where 1 = 2??? 显然它的目的是确保不匹配。

无论如何,这种使用 ADO 技术的编程风格已经相当古老了,从 DAO 到 ADO 的人们经常会打开一个游标来以这种方式遍历数据库......它不遵循关于如何做事的现代最佳实践,您可以而且应该用插入语句替换它!

它可能是在 jet4.0/access 2000 之前编写的,在这种情况下,它试图模拟参数化存储过程。虽然如果系统比这更现代,我强烈建议使用存储过程,因为它有很多好处。缓存执行计划,减少SQL注入机会的参数

实际上,我在 12 年前左右编写代码时非常像这样:p 主要是因为我不知道更好,不管使用的是什么技术。

【讨论】:

  • 当所有代码用于插入记录时,该代码可确保不返回任何结果。
  • +1 表示真正发现这种 DB 编码风格来自何处的答案。
  • -1:我认为你应该给原来的程序员一些功劳。一方面,没有进行迭代,1 = 2 也不是没用的;它用于检索包含模式定义的空记录集——实际上是一个不错的技巧。这是一种模拟参数化查询的简单方法,从而避免了 SQL 注入。您建议将重写作为 INSERT,但不建议使用参数化查询,从而否定正在使用的技术最重要的好处之一。
  • 除非我知道系统是什么,否则我不能给原始程序员的功劳。也许如果它是 JET 和 Jet 4.0/Access 2000 之前的版本,我会更加宽容,因为它们没有存储过程。如果还有什么其他的话,那么这只是一种糟糕的方法 VS 创建一个 SP [无论如何都会阻止 SQL 注入,使用缓存的执行计划等] 我能看到的唯一好处是将它视为客户端游标,因此迭代点.我的观点是从风格上假设他们是这样认为的,这确实是怀疑的好处。我认为 -1 是不必要的,但这是你的投票;)
  • 您的评论比您的回复包含的推理要好得多,您的回复大多是“无用”、“旧”和“坏”,没有太多限定。但是,请注意不要将存储过程宣传为解决 SQL 注入的方法。这不一定是真的。我见过很多受 SQL 注入影响的 SP。
【解决方案2】:

啊,不错的经典 ASP ;)

1 = 2 强制 sql 从不返回匹配项。它基本上是一种构建命令(?)的方式,这样您就可以“方便地”更改值,然后更新将存储它。

我以前见过这样做,但我自己从来没有这样做过。正如其他人所说,一个简单的参数化 INSERT 语句会更好,IMO。

【讨论】:

    【解决方案3】:

    我会使用参数化的 ADO 查询重写它。正在使用的方法有一个不必要的SELECT,这会使INSERT 变慢。

    该代码似乎有点晦涩难懂,但他们所做的只是创建记录集行的空实例,以便可以设置值并重新保存记录集。这肯定比直接插入要慢得多。

    【讨论】:

      【解决方案4】:

      我会使用插入语句。上面提到的代码似乎有点“懒惰”......就像“让 ADO 为我完成工作”一样。但是,这并没有什么问题。 where 1=2 部分用于返回“空表”......嗯......我的意思是记录集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多