我有以下代码,但我认为我需要清理env变量,但我不确定我应该如何清理它们。我意识到我可以对它进行消毒的程度有限,但我能做些什么呢?
#!/usr/bin/perl
use 5.012;
use warnings;
use autodie;
use Env qw( EDITOR VISUAL );
use File::Temp qw( :seekable );
my $editor = '/usr/bin/nano';
if ( $VISUAL ) {
$editor = $VISUAL;
}
elsif ( $EDITOR ) {
$editor = $EDITOR;
} else {
warn 'set VISUAL and EDITOR env variables not set falling back to nano'
. "\n";
}
my $tmpf = File::Temp->new;
system $editor, $tmpf->filename;
open $tmpf, '<', $tmpf->filename;
print while ( <$tmpf> );
答案 0 :(得分:1)
我在CGI脚本中只做过类似的事情,所以也许这根本不是你想要的;我只是希望它会有所帮助。这是我使用的允许字符选择的修改版本,以及代码建议:
my $editor = '/usr/bin/nano';
my $allowed = 'a-zA-Z0-9.\-_/';
# this is what I did, but you will probably not want to do this...
#$file =~ s/[^$allowed]//go; # Remove every character thats NOT in the OK-list
# check that the variables contain only allowed characters
if ($VISUAL =~ m/^[$allowed]+$/) {
$editor = $VISUAL;
}
elsif ($EDITOR =~ m/^[$allowed]+$/) {
$editor = $EDITOR;
}
else {
# message
}
# The code I have given above should also leave $editor in its default
# state if neither $VISUAL nor $EDITOR has been set, as the condition
# will not be true for empty strings/undef values.
显然,如果您注意到它们中不存在的字符(即不在$ allowed字符串中的字符),则无法更改环境变量,但是您可以检查是否存在此类字符并且在这种情况下返回默认编辑器。这只是我谦虚的建议;或许这个主题的专家会在一段时间内回复,你会在银盘上得到她/他的智慧:)
答案 1 :(得分:1)
为什么你需要对它们进行消毒?如果您的脚本用户VISUAL="rm -f"
和EDITOR与其他奇怪的东西会发生什么样的损害?您将检查编辑器操作是否成功,文件是否已打开,并且在编辑之后其内容有意义,然后才会执行任何危险操作。但是,如果用户只能破坏他们自己的文件(你没有运行可能损坏文件的系统,那么你呢?)那么就没有必要对它们进行消毒。提供违约是合理的;当地情况决定nano
是否比vim
更好。
如果用户不能通过滥用VISUAL和EDITOR来破坏你的东西,那么我不会过分担心他们会选择破坏自己的东西。
如果您正在编写将以提升的权限运行的内容 - 例如使用SetUID或SetGID权限 - 那么您必须更加担心它。 (Perl代码缺少比担心编辑器更基本的检查。哦,但是use autodie;
意味着脚本会自动中止错误。这对我来说听起来有点激进。但它可能会成为你的借口 - 虽然我注意到它没有处理system
或exec
,除非你有use autodie qw(:all);
)
答案 2 :(得分:1)
我认为你需要对此略有不同。毕竟,您的脚本似乎需要用户交互。因此,询问用户使用哪个编辑器是不合理的。您可以在执行编辑器之前发出提示,如下所示:
Which editor would you like to use [/usr/bin/vi]?
默认情况下会从$ENV{EDITOR}
,$ENV{VISUAL}
填写,或者如果两者都未定义,则/usr/bin/nano
。这样,用户可以判断该值是否有意义。
如果你对$ENV{EDITOR}
指向的地方感到偏执,你可能也必须对某人是否可以在用户的路径中放置恶意可执行文件并将其命名为greateditor
或其他类似物而感到偏执。
答案 3 :(得分:0)
将system
与多个参数一起使用不需要您清理任何内容,因为不会调用任何shell。您可能想要检查可执行文件是否首先存在,但它会不必要地使您的程序复杂化,并且您必须查看$PATH
。此外,这些环境变量也是值得信赖的。
但是,您可能希望从系统调用退出状态。您可以先尝试拨打$VISUAL
,如果失败,则拨打$EDITOR
(如果设置了$VISUAL
,则$EDITOR
应该作为后备广告。)