請求方法 POST w JSON

使用請求方法 POSTSSL 結合使資料傳輸更安全。

此外…

  • 不再需要大多數編碼和解碼
  • 該 URL 對任何一個都是可見的,需要進行 url 編碼。
    資料將單獨傳送,因此應通過 SSL 保護
  • 資料的大小幾乎沒有得到證實
  • 仍然需要防止跨邊指令碼(XSS)

為了使這個展示簡單,我們希望接收 JSON 資料,
並且應該通過跨源資源共享 (CORS)進行通訊。

以下指令碼還將演示兩種不同的內容型別

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

當通過 POSTJSON-Data 傳送到此指令碼時,你將獲得 {"message":"Hello World!"} 作為答案。其他任何東西都會收到 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

最後但並非最不重要的是,不要忘記迴應所有請求,否則第三方程式不會知道他們是否成功