我正在申请cicindela2 recommendation engine
它使用Apache mod_perl
和Perl DBI
模块。
以下是它如何工作的粗略流程
我配置了一个聚合并运行了项目批处理脚本。我知道批处理成功,因为我看到了DB处理的输出。但是当我尝试使用触发推荐处理程序的URL访问推荐结果时,我看到一个空白的白页,日志说
致命:在DBIx :: ContextualFetch :: db = HASH(0x7f2a76169e78)的参数1中的不安全依赖性 - >在/usr/local/share/perl5/Ima/DBI.pm第398行使用-T开关运行时的prepare_cached方法调用。
这是从Ima::DBI
基本模块抛出错误的地方
sub _mk_sql_closure {
my ($class, $sql_name, $statement, $db_meth, $cache) = @_;
return sub {
my $class = shift;
my $dbh = $class->$db_meth();
# Everything must pass through sprintf, even if @_ is empty.
# This is to do proper '%%' translation.
my $sql = $class->transform_sql($statement => @_);
return $cache # Line 398
? $dbh->prepare_cached($sql)
: $dbh->prepare($sql);
};
}
看来程序编写的SQL查询是不安全的,对吧?
这个错误的原因是什么?
它与DBI的缓存管理功能有关吗?
如果我定期清除缓存会解决吗?
此外,我尝试记录生成的SQL语句,但即使我在推荐处理程序的handle子例程中放置了类似$LOGGER->warn("123")
的内容,输出也会失败。
为什么日志失败以及如何正确记录?
Insecure dependency... while running with -T switch
是Perl告诉你运行时taint mode处于活动状态并试图对可能不安全的污染数据进行操作的方式。在这种特殊情况下,$sql
受到污染,因为它的部分或全部内容来自程序外部的来源 - 可能是用户输入,尽管它也可以从文件中读取。
要解决这个问题,你需要考虑$sql
的来源,以便你可以找到适当的方法来清理它。
在最可能的情况下,您已要求用户提供搜索词,然后将这些词直接插入到SQL字符串中。总的来说这是一个坏主意,因为它可以让您了解SQL注入攻击的可能性。 (强制性的Bobby Tables链接。)修改你的SQL处理以使用SQL placeholders而不是将用户输入插入到WHERE
子句中,这个漏洞应该消失。
如果受污染的数据以其他方式进入$sql
,则需要使用正则表达式来清除受污染的数据以验证它并捕获经过验证的数据,然后将捕获的数据分配给变量。例如。,
my $tainted = <STDIN>;
$tainted =~ /([A-Z]*)/; # Only allow uppercase characters
my $clean = $1; # No longer tainted because it came from $1
如果您需要采用这种方法,请不要使用.*
作为您的正则表达式来解释数据而不需要认真,认真考虑,因为,如果您只是盲目地接受任何和所有数据,您将丢弃由污点模式提供的任何和所有好处。