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"何か別の奇妙なものを編集した場合、どのような損害が発生するでしょうか? 危険なことをする前に、エディター操作が成功したこと、ファイルが開かれたこと、編集後にその内容が意味を成していることを確認します。しかし、ユーザーが自分のファイルを損傷することしかできない場合 (ファイルを損傷する可能性のあるシステムを実行していない場合)、それらをサニタイズする必要はあまりありません。デフォルトを提供することは合理的です。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]?

デフォルトは from から入力されるか$ENV{EDITOR}$ENV{VISUAL}どちらも定義されていない場合は/usr/bin/nano. そうすれば、ユーザーは値が意味をなすかどうかを判断できます。

どこに$ENV{EDITOR}ポイントがあるかについて偏執的である場合は、誰かが悪意のある実行可能ファイルをユーザーのパスに配置し、それに名前を付けた可能性があるかどうかについても偏執的である必要がありますgreateditor

于 2010-12-15T23:29:14.953 に答える
0

system複数の引数を使用しても、シェルが呼び出されないため、何もサニタイズする必要はありません。最初に実行可能ファイルが存在するかどうかを確認したい場合がありますが、プログラムが不必要に複雑になるため、$PATH. また、これらのような環境変数は一般的に信頼されています。

ただし、システムから終了ステータスを呼び出したい場合があります。そして$VISUAL、最初に呼び出しを試み、失敗した$EDITOR場合は呼び出します ($VISUALが設定され$EDITORている場合は、フォールバックとして機能するはずです)。

于 2010-12-15T17:15:41.877 に答える