【发布时间】: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, collation_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