使用cicindela2“使用-T开关运行时不安全的依赖关系错误”

时间:2018-09-05 04:35:40

标签: perl dbi recommendation-engine dbix-class mod-perl

我正在应用cicindela2 recommendation engine

它使用Apache mod_perl和Perl DBI模块。

这是工作原理的大致流程

  • 记录处理程序输入的数据

  • 数据通过过滤器链进行批处理

  • 临时表从批处理中输出

  • 通过访问触发处理推荐操作的推荐处理程序来请求推荐结果

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

  

FATAL:DBIx :: ContextualFetch :: db = HASH(0x7f2a76169e78)-> prepare_cached方法调用在/usr/local/share/perl5/Ima/DBI.pm行中使用-T开关运行时,对参数1的依赖关系不安全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语句,但是即使将$LOGGER->warn("123")之类的东西放置在“推荐处理程序”的handle子例程中,输出也会失败。

日志如何失败以及如何正确记录?

1 个答案:

答案 0 :(得分:4)

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

如果您需要采用此路线, 请勿 请使用.*作为正则表达式来取消对数据的污染,而无需认真考虑,因为,如果您仅仅盲目接受所有数据,您将丢弃污点模式提供的所有收益。