私は基本的wget
に遊んでページをダウンロードし、そのページのいくつかの情報を検索し、その情報にwget
基づいて別のページを表示するスクリプトを作成しました。デフォルトでは、私のコードは次のようになります。
defautltCommand="wget -v"
formValue=$(cat myfileA.html | get_field_value )
command="${defaultCommand} --post-data=\"myfield=${formValue}\""
echo "Command 3: ${command}"
echo "${command}" | bash
ただし、このソリューションにはいくつかの問題があります。最大の問題は、htmlファイルにいくつかの邪悪な値(たとえば、" google.com; <evil command>; ls "
私のスクリプトはNetworkManagerスクリプトとしてrootとして実行される必要があるためです。 . これはエラーが発生したときにデバッグするのに非常に便利です。
コードの挿入を防ぐための良い方法はありますか?それとももっと良い方法がありますか?私の最初の考えは、すべての参照を次のように置き換えることでしたが、... | sed 's/"/\\/g"'
コードを挿入するすべての可能な方法を見つけたかどうかはわかりません。
ありがとうございます!
ベストアンサー1
コードをシェルにパイプすることはほとんど常にエラーです。ここではすでにシェルでコードを実行しているので、他のシェルを実行する理由はまったくありません。
また、その部分を文字列に入れてコマンドを作成しないでください。コマンドは文字列のリストです。これを文字列で埋めようとすると、引数を区切るスペースと引数内のスペースの間の区切りが失われます。そして 文字列を分割して実行しようとすると、他の問題が発生します。、その一部はセキュリティへの影響。しかし、とにかくここでは必要ありません。あなたは仕事をとても複雑にしています。
form_value=$(cat myfileA.html | get_field_value )
wget -v --post-data="$form_value"
wget -v
その部分を変更できるようにしたいのですがスクリプトの制御下で、その部分にスペースや何も含まれていないことがわかっている場合は、\[*?
その部分を変数に入れることができます。
wget='wget'
if [ -n "$verbose" ]; then
wget="$wget -v"
fi
form_value=$(cat myfileA.html | get_field_value )
$wget --post-data="$form_value"
スクリプトがksh、bash、またはzshで実行されますが、通常のshでは実行されない場合は、コマンドを配列に入れることができます。
#!/bin/ksh
…
download=(wget -v --post-data="$form_value")
…
"${download[@]}"
内容を反響するとき、制御文字に注意してください。これにより、端末がジョブを実行したり、実際に印刷された内容が歪むことがあります。。
echo "$wget --post-data=$form_value" | tr -c '[:print:]' '?'