0

STDIN(パイプメール)から件名とリターンパスを取得し、件名を使用してカスタムcurlクエリを実行する簡単なスクリプトがあります。

#!/usr/bin/env bash

# Check for the sender email address and subject.
# Assign them to variables for use later.
while read -r key value; do
    case $key in
        Subject:) subject=$value;;
        Return-Path:) return_path=$value;;
    esac
done

# Run a curl query utilizing a modified version of the subject (replacing spaces with plus symbols)

curl "https://foo.com/&q="${subject// /+}"" >> foo.txt

しかし、私の懸念は、これが次のような問題のあるサブジェクトヘッダーの悪意のある(または偶発的な)使用のための穴を残すことです。rm -fr /;

これを防ぐ簡単な方法はありますか?

これが漠然とした質問である場合は、お詫び申し上げます。私はスクリプトを初めて使用するので、スクリプトの強化/サニタイズに関する知識は非常に限られています。初心者向けの参考資料があれば教えてください。


アップデート。改訂されたスクリプトは次のとおりです。

#!/usr/bin/env bash

# Check for the sender email address and subject.
# Assign them to variables for use later.
while read -r key value; do
    case $key in
        Subject:) subject="$value";;
        Return-Path:) return_path="$value";;
    esac
done

# Run a curl query utilizing a modified version of the subject (replacing spaces with plus symbols)

curl "https://foo.com/&q=\"${subject// /+}\"" >> foo.txt
4

3 に答える 3

3

はい。常に引用符を使用してください。常に

foo="$bar"
于 2012-08-14T23:25:54.563 に答える
1

申し訳ありませんが、現在受け入れられている回答は間違っています。geirhaが指摘したように、割り当ての周りに引用符は必要ありません。

しかし、変化する

curl "https://foo.com/&q=\"${subject// /+}\"" >> foo.txt

curl "https://foo.com/&q=${subject// /+}" >> foo.txt

もちろん、2つのシェルを介してデータを実行している場合を除いて、「2レベルの引用符を適用する」などのことはありません。

sh仕様のセクション2.2.1から2.2.3を読んで、引用がどのように機能するかをよく理解してください。また、2.6.5「フィールド分割」を読んで、二重引用符で囲まれていない変数がどのように分割されるかを理解してください。

もちろん、信頼して別のシェルで実行している場合を除き、外部入力をコマンドとして処理してコマンドを「注入」することはできません

于 2012-08-15T09:04:16.360 に答える
1

カールはあなたのためにそれをurlencodeすることができます。

while read -r key value; do
    case $key in
        Subject:) subject=$value;;
        Return-Path:) return_path=$value;;
    esac
done

curl --get --data-urlencode "q=$subject" "https://foo.com/" >> foo.txt

件名に何が含まれていても、コードとして扱われることはありません。

于 2012-08-15T08:24:00.900 に答える