수색…


요청 방법 : GET

GET 통해 CGI 스크립트를 호출하는 것은 매우 쉽습니다.
먼저 스크립트의 encoded url 이 필요합니다.

그런 다음 물음표를 추가 ? 변수가 뒤 따른다.

  • 모든 변수에는 =로 구분 된 두 개의 섹션이 있어야합니다.
    첫 번째 섹션은 항상 각 변수에 대해 고유 한 이름이어야합니다.
    두 번째 부분에는 값만 있습니다.
  • 변수는 &
  • 문자열의 총 길이가 255 자를 넘지 않아야합니다.
  • 이름과 값은 html로 인코딩해야합니다 ( </, /? : @ & = + $ )
    힌트:
    html-forms를 사용할 때 요청 방법은 자체적으로 생성 될 수 있습니다.
    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 이 있으며, 가장 일반적인 Data-Types 은 ...

  • 텍스트 / HTML
  • 텍스트 / 일반
  • 응용 프로그램 / json

요청을 보낼 때 서버는 많은 환경 변수도 작성합니다. 현재 가장 중요한 환경 변수는 $REQUEST_METHOD$QUERY_STRING 입니다.

요청 방법이어야한다 GET 아무 것도!
질의 문자열 은 모든 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

부정적인 부작용 ...

  • 모든 인코딩과 디코딩은 멋지지 않지만 필요합니다.
  • 요청은 대중이 읽을 수있게되며 트레이를 남겨 두게됩니다.
  • 요청 크기가 제한되어 있습니다.
  • Cross-Side-Scripting (XSS)에 대한 보호가 필요합니다.

요청 방법 : POST / w JSON

Request Method POSTSSL 과 함께 사용하면 데이터 전송을보다 안전하게 할 수 있습니다.

게다가...

  • 대부분의 인코딩 및 디코딩은 더 이상 필요하지 않습니다.
  • URL은 어느 URL에서나 볼 수 있으며 URL 인코딩이 필요합니다.
    데이터는 별도로 전송되므로 SSL을 통해 보안되어야합니다.
  • 데이터의 크기는 거의 선택 취소됩니다.
  • Cross-Side-Scripting (XSS)에 대한 보호가 여전히 필요합니다.

이 쇼케이스를 단순하게 유지하기 위해 JSON 데이터 를 받기를 원합니다.
통신은 Cross-Origin Resource Sharing (CORS)을 통해 이루어져야합니다.

다음 스크립트는 두 가지 다른 Content-Types 도 보여줍니다.

#!/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!"} 답이 POST 됩니다. 다른 모든 것은 html 문서를 받게됩니다.

중요한 것은 varialbe $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