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"`;
変数に出力をキャプチャします$new
。perl
taintモードがオンのときにこれをどのように実行できますか?
答え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
使用の間で同様にチェックする必要があります。