web-dev-qa-db-ja.com

procmailを介して電子メールをスクリプトにパイプする最も安全な方法は何ですか?

メールをスクリプトに渡す簡単なprocmailrcレシピがあります。

LOGFILE=/home/foouser/procmail-log
VERBOSE=yes
MAILDIR=/var/spool/mail/foouser
DEFAULT=/var/spool/mail/foouser
Shell=/bin/sh
DELIVERED=yes
COMSAT=no

:0
| `/home/foouser/scripts/footool/footool.sh`

スクリプト自体はかなり回復力があり、かなり安全です。私の懸念は、procmailレシピ自体が正しくサニタイズされない可能性があり、それをパイプする過程で、たとえば; rm -rf /を含む電子メールが大混乱を引き起こす可能性があることです。二重引用符を使用する必要がありますか?

詳しくは

いくつかのフィードバックに基づくと ここ 、シェルメタを一時的に無効にして二重引用符を使用したいようです。

したがって、推奨されるコード実装は次のように変更される可能性があります。

LOGFILE=/home/foouser/procmail-log
VERBOSE=yes
MAILDIR=/var/spool/mail/foouser
DEFAULT=/var/spool/mail/foouser
Shell=/bin/sh
DELIVERED=yes
COMSAT=no
savedMetas  = $SHELLMETAS
SHELLMETAS    # Kill variable

:0
| "/home/foouser/scripts/footool/footool.sh"
SHELLMETAS  = $savedMetas    

それは良く見えますか?

2
Mike B

footools.shの-​​outputという名前のコマンドをなんらかの方法で実行しようとしているのでない限り、この呼び出しは正しくありません。

:0
| `/home/foouser/scripts/footool/footool.sh`

これは通常の構文です。

:0
| /home/foouser/scripts/footool/footools.sh

procmailfootools.shを実行し、メールをstdinのスクリプトに渡します。

$SHELLMETASまたは特別なエスケープは必要ありません。 $SHELLMETASは、特殊文字をargumentsとしてスクリプトに送信する必要があるが、それらの引数をシェルで解釈したくないという異常な場合に使用します。上記のような単純なユースケースでは、無視しても問題ありません。

3
grebneke