在使用Perl和污点模式的CGI脚本中,给定以下内容,我无法通过以下步骤。
我通常使用Data::Validate::Domain来检查“有效”的域名,但无法以不出现污染变量错误的方式部署它。
我阅读到,为了使变量不受污染,您必须通过具有捕获组的
tail /etc/httpd/logs/error_log /usr/local/share/perl5/Net/DNS/Dig.pm line 906 (#1) (F)您尝试执行污点机制不喜欢的操作。 当您正在运行setuid或setgid时,或者当您显式指定-T时,污点机制会打开。 污点机制标记直接或间接派生自用户的所有数据,认为用户不值得信任。 如果在“危险”操作中使用了任何此类数据,则会出现此错误。 有关更多信息,请参见perlsec。
[Mon Jan 6 16:24:21 2014] dig.cgi:在使用-T开关运行时,在eval中存在不安全的依赖项,位于/usr/local/share/perl5/Net/DNS/Dig.pm第906行。
代码:
#!/usr/bin/perl -wT
use warnings;
use strict;
use IO::Socket::INET;
use Net::DNS::Dig;
use CGI;
$ENV{"PATH"} = ""; # Latest attempted fix
my $q = CGI->new;
my $domain = $q->param('domain');
if ( $domain =~ /(^\w+)\.(\w+\.?\w+\.?\w+)$/ ) {
$domain = "$1\.$2";
}
else {
warn("TAINTED DATA SENT BY $ENV{'REMOTE_ADDR'}: $domain: $!");
$domain = ""; # successful match did not occur
}
my $dig = new Net::DNS::Dig(
Timeout => 15, # default
Class => 'IN', # default
PeerAddr => $domain,
PeerPort => 53, # default
Proto => 'UDP', # default
Recursion => 1, # default
);
my @result = $dig->for( $domain, 'NS' )->to_text->rdata();
@result = sort @result;
print @result;
我通常使用Data::Validate::Domain来检查“有效”的域名,但无法以不出现污染变量错误的方式部署它。
我阅读到,为了使变量不受污染,您必须通过具有捕获组的
regex
并将捕获组连接起来进行传递。所以我部署了$domain =~ /(^\w+)\.(\w+\.?\w+\.?\w+)$/
。如此处所示,这不是用于消毒域名并覆盖所有可能域名的最佳regex
,但它符合我的需求。不幸的是,我的脚本仍然产生了污染失败,我无法弄清楚原因。
Regexp-Common没有提供域名regex
,并且模块似乎无法与解除污染的变量一起使用,所以现在我很失落。
如何使这个东西通过污点检查?
$domain
进行了去污),那个模块可能只是无法使用严格模式。 - ThisSuitIsBlackNot