我目前正在重写OTRS票务系统中使用的一些自定义perl代码,该代码用于创建类似SQL的查询。是的,可能有更好的方法来逃避输入,但是我们不要进入这个......
$Param{PostMasterSearch}
包含test'test@domain.tld
之类的电子邮件地址(请注意'
)。
my $PostMasterSearch = $Param{PostMasterSearch};
$PostMasterSearch =~ s/'//gms;
$Self->{LogObject}->Log(
Priority => 'error',
Message => "XXXXX: $PostMasterSearch",
);
$SQLExt .= " $Field LIKE '$PostMasterSearch'";
所以我的期望是,我会找到一条日志消息,说XXXXX: testtest@domain.tld
,并且SQL查询的一部分就像Email LIKE 'testtest@domain.tld'
。
但实际上,我只收到了日志消息 - SQL查询字符串无论出于何种原因Email LIKE 'test'test@domain.tld'
。
使用代码的最后一行拧紧
$SQLExt .= " $Field LIKE '$PostMasterSearch' X";
没有任何意义 - 但返回字符串Email LIKE 'testtest@domain.tld' X
。
有关为什么$PostMasterSearch
仍然包含应该早已消失的'
的任何提示?或者提示如何将$SQLExt
与'
- $PostMasterSearch
的更少版本连接起来?
答案 0 :(得分:0)
好的,现在这是令人尴尬的部分......
事实证明,这个脚本多次包含相同的代码并多次执行...
因此上面发布的代码实际上有效并且不会返回任何错误(就像它应该的那样)。错误消息是由代码的下一次出现引起的,尚未修补。
tl; dr:我可能应该删除该脚本并从头开始重写。