Sök…


Begärningsmetod: GET

Det är ganska enkelt att ringa ett CGI-script via GET .
Först behöver du skriptets encoded url .

Sedan lägger du till ett frågetecken ? följt av variabler.

  • Varje variabel bör ha två sektioner separerade med = .
    Det första avsnittet ska alltid vara ett unikt namn för varje variabel,
    medan den andra delen endast har värden
  • Variabler separeras av &
  • Strängens totala längd bör inte öka över 255 tecken
  • Namn och värden måste html-kodas (ersätt: </, /?: @ & = + $ )
    Ledtråd:
    När du använder html-formulär kan förfrågningsmetoden genereras av sig själv.
    Med Ajax kan du koda alla via kodningURI och kodningURICkomponent

Exempel:

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

Servern ska bara kommunicera via resursdelning mellan ursprung (CORS) för att göra förfrågan säkrare. I denna showcase använder vi CORS att bestämma Data-Type vi vill använda.

Det finns många Data-Types vi kan välja mellan, de vanligaste är ...

  • text / html
  • text / plain
  • application / json

När du skickar en begäran skapar servern också många miljövariabler. För närvarande är de viktigaste miljövariablerna $REQUEST_METHOD och $QUERY_STRING .

Förfrågningsmetoden måste vara GET ingenting annat!
Frågesträngen innehåller alla html-endoded data .

Manuset

#!/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-dokumentet ser ut så här ...

<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>

Utgången av variablerna kommer att se ut så här ...

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

Negativa biverkningar ...

  • All kodning och avkodning ser inte bra ut, men behövs
  • Begäran kommer att vara offentligt läsbar och lämna ett fack bakom
  • Storleken på en begäran är begränsad
  • Behöver skydd mot cross-side-scripting (XSS)

Begärningsmetod: POST / w JSON

Att använda Request Method POST i kombination med SSL gör datatransfer säkrare.

För övrigt...

  • Det mesta av kodningen och avkodningen behövs inte längre
  • URL: n kommer att vara synlig för alla och måste kodas url.
    Uppgifterna skickas separat och därför bör de säkras via SSL
  • Storleken på uppgifterna är nästan obelyst
  • Behöver fortfarande skydd mot Cross-Side-Scripting (XSS)

För att hålla denna utställning enkel vill vi ta emot JSON Data
och kommunikationen bör ske över resursdelning mellan ursprung (CORS).

Följande manus visar också två olika innehållstyper .

#!/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

Du får {"message":"Hello World!"} Som ett svar när du skickar JSON-data via POST till detta skript. Allt annat får html-dokumentet.

Viktigt är också varialbe $JSON . Denna variabel är fri från XSS, men kan fortfarande ha fel värden i den och måste verifieras först. Kom ihåg det.

Den här koden fungerar på samma sätt utan JSON.
Du kan få all information på detta sätt.
Du behöver bara ändra Content-Type efter dina behov.

Exempel:

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

Sist men inte minst, glöm inte att svara på alla förfrågningar, annars kommer tredjepartsprogram inte att veta om de lyckades



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow