Perl汚染モード:安全でない依存関係

Perl汚染モード:安全でない依存関係

ERROR: Insecure dependency in `` while running with -T switch at

Perlスクリプトでbashスクリプトを実行しています。

my $date_tmp="31-DEC-2016";
my $new  = `/bin/sh ./compareDate.sh "$date_tmp"`;

変数に出力をキャプチャします$newperltaintモードがオンのときにこれをどのように実行できますか?

ベストアンサー1

~からペルセク:

   ...otherwise the only way to bypass the
   tainting mechanism is by referencing subpatterns from a regular
   expression match.  Perl presumes that if you reference a substring
   using $1, $2, etc., that you knew what you were doing when you wrote
   the pattern.

したがって、外部スクリプトからデータをインポートして作業する必要があると仮定すると、取得したデータを検証する必要があります。私は四肢に出て、compareDate.sh与えられた日付と今日の間の日数を返すように提案します。ように:

$ /bin/sh ./compareDate.sh "$date_tmp"
42

その後、次のようにクリーニングできます。

my $new  = `/bin/sh ./compareDate.sh "$date_tmp"`;    # TAINTED
if ($new =~ /^(\d+)$/) {
  $new = $1;                                          # Not tainted
} else {
  die "Unexpected output from compareDate.sh!\n";
}

コードは単に変数をクリアするのではなく(ただし、私たちのチェックは緩すぎるかもしれませんが、可能です)、予想されるものがあるかどうかを確認します。誰もがこれを台無しにしたい場合は、以下を含めるようにしてください。

$ /bin/sh ./compareDate.sh "$date_tmp"
42; /bin/rm -rf *;

これにより確認が失敗します。数字だけが通過することができ、私たちはそれが私たちに問題を引き起こしたくありません。明らかに、より複雑な出力はより多くの検証を必要とするかもしれません。


上記の内容を書くときに主にコードを見ていましたが、$date_tmpコードからリテラル文字列が割り当てられ、汚染されてはいけませんでした。しかし、Jordanが指摘したように、エラーメッセージはバックティックの実行がまったく発生しないことを示しています。問題は、シェルの出力ではなく、実行を妨げるいくつかの初期汚染です。

バックティックの唯一の変数なので、割り当てとバックティックの$date_tmp使用の間で同様にチェックする必要があります。

おすすめ記事