.bashrc
私のファイルには、パラメータを使用してSSHを介してリモートサーバーでスクリプトを実行する機能があります。
現在、この機能には以下が含まれます。
function runMyScript {
if [ $1 = "s3" ]
then
ssh -i "~/path/to/.pem" server.amazonaws.com "/home/ubuntu/scripts/script.sh ${1} ${2} ${3}"
elif [ $1 = "ec2" ]
then
ssh -i "~/path/to/.pem" server.amazonaws.com "/home/ubuntu/scripts/script.sh ${1} ${2}"
else
echo "** Run with s3 or ec2 options"
fi
}
したがって、orを使用してrunMyScript arg_1 arg_2 arg_3
関数を呼び出すことができますrunMyScript arg_1 arg_2
。
この関数をより安全にし、パラメータの挿入を防ぐために、どのように再構築する必要がありますか?
ベストアンサー1
可能なパラメータ注入を防ぐ方法は何ですか?
渡したい入力タイプを見つけて、パラメータにその入力のみが含まれていることを確認してください。
少なくともリモートシェル関連の文字が含まれていないことを確認してください。
$1
既知の値と比較するため、これは大きな問題ではありません。ただし、二重引用符を使用する必要があります。それ以外の場合は、比較で複数の単語に拡張でき、興味深い値を渡すことができます(1 -o x
比較を通過するのと似ています)。
代わりに使用してくださいif [ "$1" = "s3" ] ; then ...
。
$2
andの場合、$3
andに渡すことは基本的にorに渡すのと同じですssh
。すべての交換はリモートで拡張されます。eval
sh -c
私たちが走るとしましょうssh somehost "echo $var"
。これvar
が含まれている場合、$(ls -ld /tmp)
リモートコマンドラインはecho $(ls -ld /tmp)
リモートls
で実行されます。変数を二重引用符で囲むことはコマンドの拡張には役立ちませんが、一重引用符で囲むことは役立ちます。コマンドが記録されると、
ssh somehost "echo '$var'"
コマンド拡張は行われません。
変数内の一重引用符は一重引用符を終了するため、まだ問題になるため、少なくとも次の点を確認する必要があります。
case "$var" in *"'"*) echo var has a single-quote; exit 1 ;; esac
渡したくない特殊文字があるかどうかを確認することもできます。ドル記号はほとんどの拡張を開始し、バックティックはコマンド拡張を開始し、引用符も私が信頼しないことです。
case "$var" in *[\'\"\$\`]*) echo var has something funny; exit 1 ;; esac
でもそれが全部かはよく分からないので、渡したい文字をホワイトリストに登録しておくのが良いようです。文字、数字、ダッシュ、アンダースコアで十分な場合:
case "$var" in *[!-_a-zA-Z0-9]*) echo var has something funny; exit 1 ;; esac
これでこれが開始かもしれません。
function runMyScript {
case "$2" in *[!-_a-zA-Z0-9]*) exit 1 ;; esac
case "$3" in *[!-_a-zA-Z0-9]*) exit 1 ;; esac
if [ "$1" = "s3" ] ; then
ssh somehost "script.sh '$1' '$2' '$3'"
elif [ "$1" = "ec2" ] ; then
ssh somehost "script.sh '$1' '$2'"
else
echo "** Run with s3 or ec2 options"
fi
}
function runMyScript
代わりにを使用しており、runMyScript()
通常のPOSIXシェルを実行していません。 Bashの場合は、パターンの一致をオーバーライドできます。テスト[[...]]
、正規表現一致サポート。
最新バージョンの Bash には、入力として再利用できる形式で引用された${var@Q}
コンテンツを生成する拡張機能もあります。var
うまくいくかもしれませんが、テストするのに十分な新しいbashはありません。
また、私はシェル言語のすべての可能な特徴を覚えていると盲目的に信じてはいけません。