【问题标题】:Same code executed on different servers (same version) yields different results在不同服务器(相同版本)上执行的相同代码会产生不同的结果
【发布时间】:2014-09-09 16:57:58
【问题描述】:

Delphi 遗留代码的问题。添加了一行代码来纠正一个错误并创建了一个新错误。

新错误导致相同的可执行文件在不同的服务器上产生不同的结果(在可执行文件上将指针从 dev 切换到 prod 环境)。

代码:

sEscapedString:=stringreplace(sStringIn,'[','''+char(27)+''[',[rfReplaceAll]);
sEscapedString:=stringreplace(sEscapedString,']','''+char(27)+'']',[rfReplaceAll]);
sEscapedString:=stringreplace(sEscapedString,'''','''''',[rfReplaceAll]);// this line created new 
bug
result:=' like ''' + Trim(sEscapedString) + '%'''+'  escape char(27) ';

当针对 dev 运行代码时,此查询会查找其中包含字符 '[' 和 ']' 的对象 针对 prod 查询没有找到这些项目:

我检查的第一件事是数据:两种情况完全相同 我检查的第二件事是 SQL 服务器版本(两台服务器上的 11.0.3128) 我要检查的第三件事是这些服务器上的设置: DBCC 用户选项; -- 两者相同 SELECT name, collat​​ion_Name FROM sys.databases -- 两者相同 选择@@OPTIONS - 两者都相同。 两个服务器的带引号的标识符都是“ON”

归根结底,我知道一台服务器对转义字符 (chr(27)) 的处理方式与另一台不同,但我确实知道原因。

关于为什么 2 个相似的服务器对转义字符的处理方式不同,有人有理论(或答案)吗?

这里的目标是让 prod 服务器返回带有 '[' 和 ']' 的值,因为设置我的系统以使用旧代码将需要很多额外的时间。我确实对代码进行了修复

sEscapedString:=stringreplace(sStringIn,'[','[[]',[rfReplaceAll]);

但更快的选择似乎是让服务器读取相同的值。

更新:我们找到了差异的根本原因,它比我们预期的更平凡,结果我们正在运行的查询实际上被执行了两次。第二次执行缺少生产服务器上的关键部分。 该问题已通过移动新代码行使其首先执行而不是最后执行来解决。

【问题讨论】:

  • 我强烈希望添加sql-injection标签;)
  • 不允许用户在此应用中输入数据,数据来自另一个由不同应用填充的表
  • 另一个表是如何填充的?如果它是由用户执行的,那么这就是您的 sql 注入向量。 ;)
  • 如果此时有SQL注入,那是无意的。方括号是字段的有效输入,通常表示从另一个对象派生的子对象(例如:Object 和 Object[2],Object[2] 是从 Object 派生的)。再加上一台服务器实际上正确地处理了查询。

标签: sql delphi sql-server-2012


【解决方案1】:

我首先会尝试找出该 SQL 是否仅在从应用程序发送时导致不同的行为:通过将 SQL 从交互式 SQL 客户端工具发送到两个服务器。

为了确保手动测试的 SQL 与应用程序中的完全相同,我会尝试记录或捕获从应用程序发送的确切 SQL 作为文本文件,然后将其内容粘贴到 SQL 客户端工具。

如果服务器是罪魁祸首,那么使用来自不同客户端工具的 SQL 应该会导致两台服务器出现相同的差异。如果客户端工具在两台服务器上显示相同(正确)的结果,则说明 Delphi 应用程序出现问题。

附言点赞,这是一个有趣的现象

【讨论】:

  • 我真的很想使用跟踪来准确跟踪从应用程序发送到服务器的内容,但有人告诉我,由于服务器上的额外开销,跟踪是不受限制的,而且生产服务器处理足够的关键信息,他们不想冒险。感谢您的支持,这是我目前工作中的噩梦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多