【发布时间】:2014-01-06 22:39:09
【问题描述】:
在CGI 脚本中使用Perl 和taint mode 给出以下内容,我无法通过以下内容。
代码:
#!/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+)$/。如图here 所示,它不是最好的regex,目的是去除域名的污点并覆盖所有可能的域,但它满足我的需求。不幸的是,我的脚本仍然在产生受污染的失败,我不知道是怎么回事。
Regexp-Common 没有提供域 regex,并且模块似乎无法使用无污染的变量,所以我现在不知所措。
如何让这个东西通过污点检查?
【问题讨论】:
-
我不认为问题出在你的代码中(你做了 untaint
$domain),该模块可能无法在 taint 模式下工作。 -
Scalar::Util qw(tainted)证明我的变量没有被污染,所以它肯定是某种形式的模块。感谢您的帮助和新的(对我而言)模块@Palec