"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
模块。
以下是其工作原理的大致流程
记录处理程序输入的数据
数据通过过滤器链进行批处理
临时表是批处理输出的
通过访问Recommend Handler请求推荐结果,触发Recommender的动作
我配置了聚合和 运行 项目批处理脚本。我知道批处理成功了,因为我看到了 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
如果你需要走这条路,不要使用.*
作为你的正则表达式来清除数据而不严重, 认真考虑,因为,如果你只是盲目地接受任何和所有数据,你将放弃污点模式提供的任何和所有好处。
我正在申请 cicindela2 recommendation engine
它使用 Apache mod_perl
和 Perl DBI
模块。
以下是其工作原理的大致流程
记录处理程序输入的数据
数据通过过滤器链进行批处理
临时表是批处理输出的
通过访问Recommend Handler请求推荐结果,触发Recommender的动作
我配置了聚合和 运行 项目批处理脚本。我知道批处理成功了,因为我看到了 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
如果你需要走这条路,不要使用.*
作为你的正则表达式来清除数据而不严重, 认真考虑,因为,如果你只是盲目地接受任何和所有数据,你将放弃污点模式提供的任何和所有好处。