サーチ…


リクエスト方法:GET

GETを介してCGIスクリプトを呼び出すのは簡単です。
まず、スクリプトのencoded urlが必要です。

次に、疑問符を追加し?その後に変数が続きます。

  • すべての変数は、 =で区切られた2つのセクションを持つ必要があります。
    最初のセクションは常に各変数の一意の名前にする必要があります。
    2番目の部分には値のみが含まれています
  • 変数は
  • 文字列の全長は255文字を超えてはなりません
  • 名前と値はHTMLエンコードされている必要があります( </、/?:@&= + $
    ヒント:
    htmlフォームを使用する場合、リクエストメソッドはそれ自身で生成できます。
    AjaxではencodeURIencodeURIComponentですべてをエンコードできます

例:

http://www.example.com/cgi-bin/script.sh?var1=Hello%20World!&var2=This%20is%20a%20Test.&

サーバーは、 Cross-Origin Resource Sharing (CORS)のみを介して通信し、要求をより安全にする必要があります。このショーケースでは、 CORSを使用して、使用するData-Typeを決定します。

私たちが選べる多くのData-Typesがありますが、最も一般的なものは...

  • テキスト/ html
  • テキスト/プレーン
  • アプリケーション/ json

要求を送信するとき、サーバーは多くの環境変数も作成します。今のところ最も重要な環境変数は$REQUEST_METHOD$QUERY_STRINGです。

リクエストメソッドがなければならないGET他に何も!
クエリ文字列には、すべてのhtml-endoded data含まれhtml-endoded data

スクリプト

#!/bin/bash
    
# CORS is the way to communicate, so lets response to the server first
echo "Content-type: text/html"    # set the data-type we want to use
echo ""    # we dont need more rules, the empty line initiate this.

# CORS are set in stone and any communication from now on will be like reading a html-document.
# Therefor we need to create any stdout in html format!
    
# create html scructure and send it to stdout
echo "<!DOCTYPE html>"
echo "<html><head>"
    
# The content will be created depending on the Request Method 
if [ "$REQUEST_METHOD" = "GET" ]; then
   
    # Note that the environment variables $REQUEST_METHOD and $QUERY_STRING can be processed by the shell directly. 
    # One must filter the input to avoid cross site scripting.
    
    Var1=$(echo "$QUERY_STRING" | sed -n 's/^.*var1=\([^&]*\).*$/\1/p')    # read value of "var1"
    Var1_Dec=$(echo -e $(echo "$Var1" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;'))    # html decode
    
    Var2=$(echo "$QUERY_STRING" | sed -n 's/^.*var2=\([^&]*\).*$/\1/p')
    Var2_Dec=$(echo -e $(echo "$Var2" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;'))
    
    # create content for stdout
    echo "<title>Bash-CGI Example 1</title>"
    echo "</head><body>"
    echo "<h1>Bash-CGI Example 1</h1>"
    echo "<p>QUERY_STRING: ${QUERY_STRING}<br>var1=${Var1_Dec}<br>var2=${Var2_Dec}</p>"    # print the values to stdout

else

    echo "<title>456 Wrong Request Method</title>"
    echo "</head><body>"
    echo "<h1>456</h1>"
    echo "<p>Requesting data went wrong.<br>The Request method has to be \"GET\" only!</p>"

fi

echo "<hr>"
echo "$SERVER_SIGNATURE"    # an other environment variable
echo "</body></html>"    # close html
    
exit 0

htmlドキュメントは次のようになります...

<html><head>
<title>Bash-CGI Example 1</title>
</head><body>
<h1>Bash-CGI Example 1</h1>
<p>QUERY_STRING: var1=Hello%20World!&amp;var2=This%20is%20a%20Test.&amp;<br>var1=Hello World!<br>var2=This is a Test.</p>
<hr>
<address>Apache/2.4.10 (Debian) Server at example.com Port 80</address>


</body></html>

変数の出力は次のようになります...

var1=Hello%20World!&var2=This%20is%20a%20Test.&
Hello World!
This is a Test.
Apache/2.4.10 (Debian) Server at example.com Port 80

負の副作用...

  • すべてのエンコードとデコードはうまく見えませんが、必要です
  • リクエストは一般に読めるようになり、トレイは残しておきます
  • リクエストのサイズは制限されています
  • クロスサイドスクリプティング(XSS)に対する保護が必要

リクエストメソッド:POST / w JSON

Request Method POSTSSLと組み合わせて使用​​すると、データ転送がより安全になります。

加えて...

  • エンコーディングとデコードのほとんどはもう必要ありません
  • URLは誰にでも見えるので、URLをエンコードする必要があります。
    データは個別に送信されるため、SSLを使用してデータを保護する必要があります
  • データのサイズはほとんど無視されています
  • Cross-Side-Scripting(XSS)に対する保護が必要です

このショーケースをシンプルにするために、 JSONデータ
コミュニケーションはクロス・ソース・リソース共有 (CORS)を超えなければなりません。

次のスクリプトでは、2つの異なるコンテンツタイプも示します。

#!/bin/bash

exec 2>/dev/null    # We dont want any error messages be printed to stdout
trap "response_with_html && exit 0" ERR    # response with an html message when an error occurred and close the script

function response_with_html(){    
    echo "Content-type: text/html"
    echo ""
    echo "<!DOCTYPE html>"
    echo "<html><head>"
    echo "<title>456</title>"
    echo "</head><body>"
    echo "<h1>456</h1>"
    echo "<p>Attempt to communicate with the server went wrong.</p>"
    echo "<hr>"
    echo "$SERVER_SIGNATURE"
    echo "</body></html>"
}
        
function response_with_json(){
    echo "Content-type: application/json"
    echo ""
    echo "{\"message\": \"Hello World!\"}"
}

if [ "$REQUEST_METHOD" = "POST" ]; then
   
    # The environment variabe $CONTENT_TYPE describes the data-type received
    case "$CONTENT_TYPE" in
    application/json)
        # The environment variabe $CONTENT_LENGTH describes the size of the data
        read -n "$CONTENT_LENGTH" QUERY_STRING_POST        # read datastream 

        # The following lines will prevent XSS and check for valide JSON-Data.
        # But these Symbols need to be encoded somehow before sending to this script
        QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed "s/'//g" | sed 's/\$//g;s/`//g;s/\*//g;s/\\//g' )        # removes some symbols (like \ * ` $ ') to prevent XSS with Bash and SQL.
        QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed -e :a -e 's/<[^>]*>//g;/</N;//ba')    # removes most html declarations to prevent XSS within documents
        JSON=$(echo "$QUERY_STRING_POST" | jq .)        # json encode - This is a pretty save way to check for valide json code
    ;;
    *)
        response_with_html
        exit 0
    ;;
    esac

else
    response_with_html
    exit 0
fi

# Some Commands ...

response_with_json

exit 0

JSON-DataPOST経由でこのスクリプトに送信するときは、 {"message":"Hello World!"}という回答が表示されます 。他のすべてはhtmlドキュメントを受け取ります。

重要なのは、 $JSONのバリエーションです。この変数にはXSSは含まれていませんが、依然として間違った値が含まれている可能性があり、最初に検証する必要があります。それを覚えておいてください。

このコードはJSONを使用しない場合と同様に動作します。
この方法でデータを得ることができます。
必要に応じてContent-Typeを変更するだけです。

例:

if [ "$REQUEST_METHOD" = "POST" ]; then 
    case "$CONTENT_TYPE" in
    application/x-www-form-urlencoded)
            read -n "$CONTENT_LENGTH" QUERY_STRING_POST
    text/plain)
            read -n "$CONTENT_LENGTH" QUERY_STRING_POST
    ;;
    esac
fi

最後に、すべてのリクエストに対する応答を忘れないでください。そうしないと、サードパーティ製のプログラマは成功したかどうかわかりません



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow