"Insecure dependency error while running with -T switch" 使用 cicindela2

"Insecure dependency error while running with -T switch" using cicindela2

我正在申请 cicindela2 recommendation engine

它使用 Apache mod_perl 和 Perl DBI 模块。

以下是其工作原理的大致流程

我配置了聚合和 运行 项目批处理脚本。我知道批处理成功了,因为我看到了 DB 的处理输出。但是当我尝试使用触发推荐处理程序的 URL 访问推荐结果时,我看到一个空白的白页并且日志显示

FATAL: Insecure dependency in parameter 1 of DBIx::ContextualFetch::db=HASH(0x7f2a76169e78)->prepare_cached method call while running with -T switch at /usr/local/share/perl5/Ima/DBI.pm line 398.

这是从 Ima::DBI 基本模块

/usr/local/share/perl5/Ima/DBI.pm.

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 语句,但即使我在 Recommend Handler 的 handle 子例程中放置类似 $LOGGER->warn("123") 的内容,输出也失败。

为什么记录失败,如何正确记录?

Insecure dependency... while running with -T switch 是 Perl 告诉您您 运行 taint mode 活跃并试图对可能不安全的受污染数据执行某些操作的方式。在这种特殊情况下,$sql 被污染了,因为它的部分或全部内容来自程序外部的来源——可能是用户输入,尽管它也可能是从文件中读取的。

要解决此问题,您需要考虑 $sql 的来源,以便找到适当的清理方法。

在最可能的情况下,您已要求用户提供搜索词,然后将这些词直接插入到您的 SQL 字符串中。这通常是一个坏主意,因为它使您面临 SQL 注入攻击的可能性。 (强制 Bobby Tables link.) Revise your SQL handling to make use of SQL placeholders 而不是将用户输入插入 WHERE 子句,此漏洞应该会消失。

如果受污染的数据以其他方式进入 $sql,您需要使用正则表达式来验证受污染的数据并捕获经过验证的数据,然后分配捕获的数据来清理受污染的数据到你的变量。例如,

my $tainted = <STDIN>;
$tainted =~ /([A-Z]*)/; # Only allow uppercase characters
my $clean = ;  # No longer tainted because it came from 

如果你需要走这条路,不要使用.*作为你的正则表达式来清除数据而不严重, 认真考虑,因为,如果你只是盲目地接受任何和所有数据,你将放弃污点模式提供的任何和所有好处。