1

Web フォームから情報を読み取る Perl スクリプトがあります。適切な衛生管理を行うために、ここでsystem説明されている構文を使用したいと考えています。

system ("cat", "/usr/stats/$username");ユーザー名変数が cat の引数としてのみ解釈されるように、システム コマンドを次の形式で作成する必要があることを彼らは提案しています。

複数のシステム コマンドを含む形式のコマンドがある場合system("export REPLYTO=\"$from\"; echo \"$body\" | mail -s \"$subject\"");、システム コールを適切にサニタイズするにはどうすればよいですか?

4

1 に答える 1

5

export始める前に、設定することで Perlで実行できることに注意してください$ENV{REPLY_TO}


オプション1。

String::ShellQuoteを使用できますshell_quote

use autodie qw( :all );
my $cmd = shell_quote('echo', $body) .
    '|' . shell_quote('mail', '-s', $subject);
local $ENV{REPLY_TO} = $from;
system($cmd);

オプション 2。

env var ですべてを渡します。

use autodie qw( :all );
local $ENV{REPLY_TO} = $from;
local $ENV{SUBJECT}  = $subject;
local $ENV{BODY}     = $body;
system('echo "$BODY" | mail -s "$SUBJECT"');

オプション 3。

取り除くecho

use autodie qw( :all );
local $ENV{REPLY_TO} = $from;
open(my $pipe, '|-', 'mail', '-s', $subject);
print($pipe $body);
close($pipe);
die "Child died from signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited from error ".($? >> 8)."\n" if $? >> 8;
于 2013-04-23T17:50:29.510 に答える