2

我有以下代码,但我认为我需要清理环境变量,但我不确定我应该如何清理它们。我意识到我可以对它们进行消毒的程度可能是有限的,但我能做些什么呢?

#!/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> );
4

4 回答 4

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 字符串中的字符),则无法更改环境变量,但您可以检查这些字符是否存在并退回到您的这种情况下的默认编辑器。这只是我的谦虚建议;也许该主题的专家会在一段时间内回复,您会得到她/他的智慧放在银盘上:)

于 2010-12-15T17:03:28.080 回答
1

为什么你需要彻底消毒它们?VISUAL="rm -f"如果您的脚本的用户拥有和 EDITOR 到其他奇怪的东西,将会发生什么损害?在您做任何危险的事情之前,您将检查编辑器操作是否成功、文件是否已打开以及其内容在编辑后是否有意义。但是,如果用户只能损坏他们自己的文件(您没有运行一个他们可以损坏您的文件的系统,是吗?),那么就没有太多需要对它们进行清理了。提供违约是合理的;当地情况决定了是否nano是比……更好的选择vim

如果用户不能通过滥用 VISUAL 和 EDITOR 来损坏您的东西,那么我不会太担心他们选择损坏自己的东西。

如果您正在编写将使用提升的权限运行的东西——例如,使用 SetUID 或 SetGID 权限——那么您必须更加担心它。(Perl 代码缺少比担心要使用的编辑器更基本的检查。哦,但这use autodie;意味着脚本会自动中止错误。这对我来说听起来有点激进。但它可能会原谅你 - 尽管我注意到它不处理systemexec除非你有use autodie qw(:all);

于 2010-12-15T17:25:50.463 回答
1

我认为你需要稍微不同地思考这个问题。毕竟,您的脚本似乎需要用户交互。因此,询问用户使用哪个编辑器并不是不合理的。您可以在执行编辑器之前发出提示,如下所示:

Which editor would you like to use [/usr/bin/vi]?

where the default would be filled in from $ENV{EDITOR}, $ENV{VISUAL} or if neither is defined, /usr/bin/nano. That way, the user can judge whether the value makes sense.

If you are paranoid about where $ENV{EDITOR} points, you might also have to be paranoid about whether someone could have placed a malicious executable in the user's path and named it greateditor or some such.

于 2010-12-15T23:29:14.953 回答
0

使用system多个参数不需要你清理任何东西,因为不会调用任何 shell。您可能想先检查可执行文件是否存在,但这会使您的程序不必要地复杂化,您必须查看$PATH. 像这样的环境变量通常也是可信的。

不过,您可能想从系统调用退出状态。您可以$VISUAL先尝试调用,如果失败,再调用$EDITOR(如果$VISUAL已设置,则应$EDITOR作为后备)。

于 2010-12-15T17:15:41.877 回答