我目前正在重写 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与'-less 版本连接起来的提示$PostMasterSearch?